1.CVS文件
值没有类型,所有东西都是字符串; ? 没有字体大小或颜色的设置; ? 没有多个工作表; ? 不能指定单元格的宽度和高度; ? 不能合并单元格; ? 不能嵌入图像或图表。 CSV 文件中的每个单元格 有逗号分割,也许你可以只是对每行文本调用 split()方法,来取得这些值。但并非 CSV 文件中的每个逗号,都表示两个单元格之间的分界。 CSV 文件也有自己的转义 字符,允许逗号和其他字符作为值的一部分。 split()方法不能处理这些转义字符。因 为这些潜在的缺陷,所以总是应该使用 csv 模块来读写 CSV 文件。
2.创建 Reader 对象
import csv
exampleFile = open('example.csv')
exampleReader = csv.reader(exampleFile)
exampleData = list(exampleReader)
print(
exampleData)
for i in range(len(exampleData)):
print(exampleData[i])
"""
['4/5/2014 13:34', 'Apples', '73']
['4/5/2014 3:41', 'Cherries', '85']
['4/6/2014 12:46', 'Pears', '14']
['4/8/2014 8:59', 'Oranges', '52']
['4/10/2014 2:07', 'Apples', '152']
['4/10/2014 18:10', 'Bananas', '23']
['4/10/2014 2:40', 'Strawberries', '98']
"""
3.通过下标访问
print(exampleData[0][1])
对于大型的 CSV 文件,你需要在一个 for 循环中使用 Reader 对象。这样避免 将整个文件一次性装入内存 Reader 对象只能循环遍历一次。要再次读取 CSV 文件,必须调用 csv.reader, 创 建一个对象。
exampleFile = open('example.csv')
exampleReader = csv.reader(exampleFile)
for row in exampleReader:
print("Row#" + str(exampleReader.line_num) + ' ' + str(row))
4.Writer 对象
Writer 对象让你将数据写入 CSV 文件。要创建一个 Writer 对象,就使用 csv.writer()函数。 首先,调用 open()并传入’w’,以写模式打开一个文件?。这将创建对象。然后 将它传递给 csv.writer()?,创建一个 Writer 对象。 在 Windows 上,需要为 open()函数的 newline 关键字参数传入一个空字符串。 如果忘记设置 newline 关键字参数, output.csv 中的行距将有两倍 Writer 对象的 writerow()方法接受一个列表参数。列表中的每个词,放在输出的 CSV 文件中的一个单元格中。 writerow()函数的返回值,是写入文件中这一行的字 符数(包括换行字符)。 生成的文件: spam,eggs,bacon,ham “Hello, world!”,eggs,bacon,ham 1,2,3.141592,4
import csv
outputFile = open('output.csv', 'w', newline='')
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['spam', 'eggs', 'bacon', 'ham'])
outputWriter.writerow(['Hello, world!', 'eggs', 'bacon', 'ham'])
outputWriter.writerow([1, 2, 3.141592, 4])
outputFile.close()
5.delimiter 和 lineterminator 关键字参数
默认情况下, CSV 文件的分隔符是逗号。行终止字符是出现在行末的字符。默 认情况下,行终止字符是换行符。你可以利用 csv.writer()的 delimiter 和 lineterminator 关键字参数,将这些字符改成不同的值。 传入 delimeter=‘\t’和 lineterminator=’\n\n’?,这将单元格之间的字符改变为制表符, 将行之间的字符改变为两个换行符。然后我们调用 writerow()三次,得到 3 行 apples oranges grapes
eggs bacon ham
spam spam spam spam spam spam 既然单元格是由制表符分隔的,我们就使用文件扩展名.tsv,表示制表符分隔的值。
import csv
csvFile = open('example.tsv', 'w', newline='')
csvWriter = csv.writer(csvFile, delimiter='\t', lineterminator='\n\n')
csvWriter.writerow(['apples', 'oranges', 'grapes'])
csvWriter.writerow(['eggs', 'bacon', 'ham'])
csvWriter.writerow(['spam', 'spam', 'spam', 'spam', 'spam', 'spam'])
csvFile.close()
6.项目:从 CSV 文件中删除表头
假设你有一个枯燥的任务,要删除几百CSV 文件的第一行。也许你会将它们送入一 个自动化的过程,只需要数据,不需要每列顶部的表头。可以在Excel 中打开每个文件, 删除第一行,并重新保存该文件,但这需要几个小时。让我们写一个程序来做这件事。 该程序需要打开当前工作目录中所有扩展名为.csv 的文件,读取 CSV 文件的内 容,并除掉第一行的内容重新写入同名的文件。这将用新的、无表头的内容替换 CSV 文件的旧内容。 找出当前工作目录中的所有 CSV 文件。 ? 读取每个文件的全部内容。 ? 跳过第一行,将内容写入一个新的 CSV 文件。 在代码层面上,这意味着该程序需要做到以下几点: ? 循环遍历从 os.listdir()得到的文件列表,跳过非 CSV 文件。 ? 创建一个 CSV Reader 对象,读取该文件的内容,利用 line_num 属性确定要跳 过哪一行。 ? 创建一个 CSV Writer 对象,将读入的数据写入新文件。 针对这个项目,打开一个新的文件编辑器窗口,并保存为 removeCsvHeader.py。
import csv, os
os.makedirs('headerRemoved', exist_ok=True)
for cvsFileName in os.listdir('.'):
print(cvsFileName)
if not cvsFileName.endswith('.csv'):
continue
print('Removing header from '+cvsFileName)
cvsRows=[]
cvsFileObj=open(cvsFileName)
readObj=csv.reader(cvsFileObj)
for row in readObj:
print("当前行号",readObj.line_num)
if readObj.line_num==1:
continue
cvsRows.append(row)
cvsFileObj.close()
cvsFileObj=open(os.path.join('headerRemoved',cvsFileName),'w',newline='')
cvsWriter=csv.writer(cvsFileObj)
print("writer.....")
for row in cvsRows:
cvsWriter.writerow(row)
cvsFileObj.close()
|