一、CSV文件概述
CSV,即逗号分隔值(Comma Separated Values),是一种以纯文本形式存储表格数据的通用格式。它因其简洁和易于使用而广泛应用于数据交换,如在数据库、电子表格等应用程序中导入和导出数据。CSV文件的纯文本特性使其与操作系统和编程语言无关,大多数编程语言都提供了处理CSV文件的功能,使其在数据处理和科学领域中极为流行。
CSV文件的主要特点包括:
- 纯文本格式:使用特定字符集(如ASCII、Unicode、GB2312等);
- 记录组成:由多条记录构成,通常每行代表一条记录;
- 字段分隔:记录内的字段(列)通过分隔符(如逗号、分号、制表符)分隔;
- 字段序列一致:所有记录具有相同的字段顺序。
CSV文件不仅可用文本编辑器查看和编辑,还能在如Excel这样的电子表格软件中打开,几乎与原生电子表格文件无异。数据库系统通常支持将数据导出为CSV格式,也支持从CSV文件导入数据。
二、将数据写入CSV
假设我们需要将五个学生的三门课程成绩保存到CSV文件中。在Python中,我们可以使用内置的csv
模块来实现。csv
模块的writer
对象允许我们通过writerow
或writerows
方法将数据写入CSV文件。以下是实现的示例代码:
import csv
import random# 打开文件用于写入,'w'模式表示写入,如果文件不存在则创建
with open('scores.csv', 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)# 写入表头writer.writerow(['姓名', '语文', '数学', '英语'])# 学生姓名列表names = ['关羽', '张飞', '赵云', '马超', '黄忠']for name in names:# 为每个学生生成三门课程的随机分数,并插入姓名scores = [random.randint(50, 100) for _ in range(3)]scores.insert(0, name)# 写入一行数据writer.writerow(scores)
执行上述代码后,生成的CSV文件内容示例:
姓名,语文,数学,英语
关羽,98,86,61
张飞,86,58,80
赵云,95,73,70
马超,83,97,55
黄忠,61,54,87
csv.writer
函数还允许我们通过dialect
参数指定CSV的方言,默认为excel
。我们也可以通过delimiter
、quotechar
和quoting
参数自定义分隔符、引用字符和引用方式。例如,当字段中包含特殊字符时,使用引用字符可以避免歧义。以下是对csv.writer
的一个简单自定义示例:
# 使用竖线作为分隔符,并设置所有字段都被引用
writer = csv.writer(file, delimiter='|', quoting=csv.QUOTE_ALL)
使用自定义设置生成的CSV文件内容示例:
"姓名"|"语文"|"数学"|"英语"
"关羽"|"98"|"86"|"61"
"张飞"|"86"|"58"|"80"
三、从CSV文件读取数据
要读取CSV文件中的数据,我们可以使用csv.reader
对象,它是一个迭代器,允许我们通过next
方法或for-in
循环来获取数据。以下是读取CSV文件的示例代码:
import csv# 打开文件用于读取,'r'模式表示读取
with open('scores.csv', 'r', encoding='utf-8') as file:reader = csv.reader(file, delimiter='|')# 遍历CSV文件中的每一行for line_num, data_list in enumerate(reader, start=1):print(f"行号: {line_num}\t", end='')for elem in data_list:print(f"{elem}\t", end='')print() # 换行
注意:在对csv.reader
对象进行for
循环时,每次迭代会得到一个包含该行所有字段的列表。
四、小结
在Python数据分析领域,pandas
库是一个强大的工具。它提供了read_csv
和to_csv
函数,用于简化CSV文件的读写操作。read_csv
函数可以将CSV数据读取为DataFrame
对象,而DataFrame
是pandas
中用于数据处理的核心数据结构,它包含了丰富的数据处理功能,如数据清洗、转换和聚合等。相对地,to_csv
函数可以将DataFrame
对象中的数据导出到CSV文件中,实现数据的持久化存储。这些函数相比原生的csv.reader
和csv.writer
提供了更高级的功能和更好的易用性。