CSV 表示“Comma-Separated Values(逗号分隔的值)”,CSV文件是简化的电子表格,保存为纯文本文件。Python 的csv 模块让解析CSV 文件变得容易。CSV 文件中的每行代表电子表格中的一行,逗号分割了该行中的单元格。CSV 文件是简单的,缺少 Excel 电子表格的许多功能。例如,CSV 文件中:
• 值没有类型,所有东西都是字符串;
• 没有字体大小或颜色的设置;
• 没有多个工作表;
• 不能指定单元格的宽度和高度;
• 不能合并单元格;
• 不能嵌入图像或图表。
CSV 的文件的优势是简单。CSV 文件被许多种类的程序广泛地支持,可以在文
本编辑器中查看(包括 IDLE 的文件编辑器),它是表示电子表格数据的直接方式。
因为 CSV 文件就是文本文件,所以你可能会尝试将它们读入一个字符串,例如,因为 CSV 文件中的每个单元格有逗号分割,也许你可以只是对每行文本调用 split()方法,来取得这些值。但并非CSV 文件中的每个逗号,都表示两个单元格之间的分界。CSV 文件也有自己的转义字符,允许逗号和其他字符作为值的一部分。split()方法不能处理这些转义字符。因为这些潜在的缺陷,所以总是应该使用 csv 模块来读写 CSV 文件。
常用操作
下图为exsample.csv文件
#要用csv模块从CSV文件中读取数据,需要创建一个 Reader 对象。Reader 对象让你迭代遍历 CSV 文件中的每一行。
#csv模块时python是自带的,不需要安装,这里用逗号分割的txt文件也可以用该模块处理
import csv
exsampleFile = open('exsample.csv')
#reader对象
#注意,不能将文件名字符串直接传递给该函数
exsampleReader = csv.reader(exsampleFile)
exsampleData = list(exsampleReader)# 输出exampleData -> [['4/5/2015 13:34', 'Apples', '73']
#可以用表达式 exampleData[row][col]来访问特定行和列的值
exampleData[0][0]
#对于大型的 CSV 文件,你需要在一个 for 循环中使用 Reader 对象。这样避免将整个文件一次性装入内存。每一行是一个值的列表,每个值表示一个单元格。line_num包含了当前行的行号。
for row in exampleReader:
print('Row #' + str(exampleReader.line_num) + ' ' + str(row))
#writer对象
#要创建一个 Writer 对象,就使用csv.writer()函数
#在 Windows 上,需要为 open()函数的 newline 关键字参数传入一个空字符串。
#这样做的技术原因超出了本书的范围。如果忘记设置 newline 关键字参数,output.csv中的行距将有两倍
outputFile = open('output.csv', 'w', newline='')
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['spam', 'eggs', 'bacon', 'ham'])
outputWriter.writerow(['Hello, world!', 'eggs', 'bacon', 'ham'])
#输出"Hello, world!",eggs,bacon,ham 。Writer 对象自动转义了'Hello, world!'中的逗号,在 CSV 文件中使用了双引号。
#用制表符代替逗号来分隔单元格,并有两倍行距,通过delimiter 和 lineterminator 关键字参数改变,然后使用文件扩展名.tsv表示制表符分隔的值
csvWriter = csv.writer(csvFile, delimiter='\t', lineterminator='\n\n')
csvWriter.writerow(['apples', 'oranges', 'grapes'])
项目:从CSV文件中删除表头
假设你有一个枯燥的任务,要删除几百 CSV 文件的第一行。也许你会将它们送入一
个自动化的过程,只需要数据,不需要每列顶部的表头。可以在 Excel 中打开每个文件,
删除第一行,并重新保存该文件,但这需要几个小时。让我们写一个程序来做这件事。
该程序需要打开当前工作目录中所有扩展名为.csv 的文件,读取 CSV 文件的内
容,并除掉第一行的内容重新写入同名的文件。这将用新的、无表头的内容替换
CSV 文件的旧内容。
总的来说,该程序必须做到以下几点:
• 找出当前工作目录中的所有 CSV 文件。
• 读取每个文件的全部内容。
• 跳过第一行,将内容写入一个新的 CSV 文件。
在代码层面上,这意味着该程序需要做到以下几点:
• 循环遍历从 os.listdir()得到的文件列表,跳过非 CSV 文件。
• 创建一个 CSV Reader 对象,读取该文件的内容,利用 line_num 属性确定要跳
过哪一行。
• 创建一个 CSV Writer 对象,将读入的数据写入新文件。
针对这个项目,打开一个新的文件编辑器窗口,并保存为 removeCsvHeader.py。
#与往常一样,当你写程序修改文件时,一定要先备份这些文件,以防万一你的程序没有按期望的方式工作。你不希望意外地删除原始文件。
#! python3
# removeCsvHeader.py - Removes the header from all CSV files in the current
# working directory.
import csv, os
os.makedirs('headerRemoved', exist_ok=True)
#第1步:循环遍历每个CSV文件
for csvFilename in os.listdir('.'):
if not csvFilename.endswith('.csv'):
continue # skip non-csv files
print('Removing header from ' + csvFilename + '...')
#第2步:读入CSV文件,并跳过第一行
csvRows = []
csvFileObj = open(csvFilename)
readerObj = csv.reader(csvFileObj)
for row in readerObj:
if readerObj.line_num == 1:
continue # skip first row
csvRows.append(row)
csvFileObj.close()
#第3步:写入CSV文件,没有第一行
csvFileObj = open(os.path.join('headerRemoved', csvFilename), 'w',
newline='')
csvWriter = csv.writer(csvFileObj)
for row in csvRows:
csvWriter.writerow(row)
csvFileObj.close()
针对 CSV 文件写的程序类似于针对 Excel 文件写的程序,因为它们都是电子表
格文件。你可以编程完成以下任务:
• 在一个 CSV 文件的不同行,或多个 CSV 文件之间比较数据。
• 从 CSV 文件拷贝特定的数据到 Excel 文件,或反过来。
• 检查 CSV 文件中无效的数据或格式错误,并向用户提醒这些错误。
• 从 CSV 文件读取数据,作为 Python 程序的输入。