在日常Python开发和数据处理中,我们经常需要与各种文件格式打交道,其中CSV文件是最常用、最简洁的数据交换格式之一。它广泛应用于Excel、数据库、数据分析工具之间的数据导入导出,也是Python数据处理入门阶段必须掌握的核心技能。本节课将详细讲解CSV文件的特点、Python标准库csv模块的使用,以及进阶的pandas库读写CSV的方法,帮大家轻松搞定CSV文件的读写操作。
CSV文件介绍
CSV(Comma Separated Values),全称逗号分隔值文件,是一种纯文本文件格式,用于存储表格形式的结构化数据。它的核心作用是实现不同应用程序(如Excel、数据库、Python脚本)、不同系统之间的数据交换——因为纯文本格式具有跨平台、跨语言的通用性,无论是什么操作系统(Windows、Mac、Linux)或编程语言(Python、Java、C++),都能轻松处理。
简单来说,CSV文件就是“用分隔符分割字段的纯文本表格”,本质上是简化版的电子表格,没有Excel的格式(如字体、颜色、合并单元格),只保留核心数据。
CSV文件的特点简洁明了,便于理解和处理,核心有4点:
纯文本格式:仅包含字符数据,不包含任何格式信息,可使用任意文本编辑器(如记事本、VS Code)打开,编码可选用ASCII、Unicode、GB2312等;
记录按行排列:典型情况下,CSV文件中每一行对应一条数据记录(如一个学生的信息、一条商品数据);
字段用分隔符分割:每条记录中的不同字段(列),用分隔符隔开,默认分隔符是逗号(,),也可使用分号(;)、制表符(\t)等;
字段序列统一:CSV文件中所有记录的字段数量、顺序完全一致,确保数据的结构化(如所有行都是“姓名、语文、数学、英语”四个字段)。
CSV文件可以使用文本编辑器或类似于Excel电子表格这类工具打开和编辑,当使用Excel这类电子表格打开CSV文件时,你甚至感觉不到CSV和Excel文件的区别。很多数据库系统都支持将数据导出到CSV文件中,当然也支持从CSV文件中读入数据保存到数据库中,这些内容并不是现在要讨论的重点。
将数据写入CSV文件
现有五个学生三门课程的考试成绩需要保存到一个CSV文件中,要达成这个目标,可以使用Python标准库中的csv模块,该模块的writer函数会返回一个csvwriter对象,通过该对象的writerow或writerows方法就可以将数据写入到CSV文件中,具体的代码如下所示。
import csvimport randomwithopen('scores.csv', 'w') as file: writer = csv.writer(file) writer.writerow(['姓名', '语文', '数学', '英语']) names = ['关羽', '张飞', '赵云', '马超', '黄忠']for name in names: scores = [random.randrange(50, 101) for _ inrange(3)] scores.insert(0, name) writer.writerow(scores)
生成的CSV文件的内容。
姓名,语文,数学,英语关羽,98,86,61张飞,86,58,80赵云,95,73,70马超,83,97,55黄忠,61,54,87
需要说明的是上面的writer函数,除了传入要写入数据的文件对象外,还可以dialect参数,它表示CSV文件的方言,默认值是excel。除此之外,还可以通过delimiter、quotechar、quoting参数来指定分隔符(默认是逗号)、包围值的字符(默认是双引号)以及包围的方式。其中,包围值的字符主要用于当字段中有特殊符号时,通过添加包围值的字符可以避免二义性。大家可以尝试将上面第5行代码修改为下面的代码,然后查看生成的CSV文件。
writer = csv.writer(file, delimiter='|', quoting=csv.QUOTE_ALL)
生成的CSV文件的内容。
"姓名"|"语文"|"数学"|"英语""关羽"|"88"|"64"|"65""张飞"|"76"|"93"|"79""赵云"|"78"|"55"|"76""马超"|"72"|"77"|"68""黄忠"|"70"|"72"|"51"
从CSV文件读取数据
如果要读取刚才创建的CSV文件,可以使用下面的代码,通过csv模块的reader函数可以创建出csvreader对象,该对象是一个迭代器,可以通过next函数或for-in循环读取到文件中的数据。
import csvwithopen('scores.csv', 'r') as file: reader = csv.reader(file, delimiter='|')for data_list in reader:print(reader.line_num, end='\t')for elem in data_list:print(elem, end='\t')print()
注意:上面的代码对csvreader对象做for循环时,每次会取出一个列表对象,该列表对象包含了一行中所有的字段。
总结与建议
CSV文件是纯文本结构化文件,核心是“行记录、列字段、分隔符分割”,跨平台、跨语言,是数据交换的常用格式;
标准库csv:通过csv.writer()写入、csv.reader()读取,适合简单读写,注意指定编码和分隔符,避免乱码;
进阶库pandas:通过pd.read_csv()读取、df.to_csv()写入,返回DataFrame对象,适合数据分析,效率更高、功能更强大。
实战建议:
日常简单数据读写(如保存少量用户信息、成绩),用csv标准库即可,无需额外安装依赖;
若涉及数据分析、数据清洗、大规模数据处理,优先使用pandas,后续教程会详细讲解DataFrame的核心操作;
练习时注意:写入时指定encoding='utf-8',读取时与写入时的delimiter保持一致,避免中文乱码和字段解析错误。
课后练习:尝试用csv库读取本地Excel保存的CSV文件,统计学生的平均成绩;再用pandas实现相同功能,对比两种方式的差异。