Python程序中用csv模块来操作csv文件的基本使用教程
CSV全称为“CommaSeparatedValues”,是一种格式化的文件,由行和列组成,分隔符可以根据需要来变化。
如下面为一csv文件:
Title,ReleaseDate,Director AndNowForSomethingCompletelyDifferent,1971,IanMacNaughton MontyPythonAndTheHolyGrail,1975,TerryGilliamandTerryJones MontyPython'sLifeOfBrian,1979,TerryJones MontyPythonLiveAtTheHollywoodBowl,1982,TerryHughes MontyPython'sTheMeaningOfLife,1983,TerryJones
csv可以比较方便的在不同应用之间迁移数据。可以将数据批量导出为csv格式,然后倒入到其他应用程序中。很多应用中需要导出报表,也通常用csv格式导出,然后用Excel工具进行后续编辑。
打印发行日期及标题,逐行处理:
forlineinopen("samples/sample.csv"):
title,year,director=line.split(",")
printyear,title
使用csv模块处理:
importcsv
reader=csv.reader(open("samples/sample.csv"))
fortitle,year,directorinreader:
printyear,title
改变分隔符
创建一csv.excel的子类,并修改分隔符为”;”
#File:csv-example-2.py
importcsv
classSKV(csv.excel):
#likeexcel,butusessemicolons
delimiter=";"
csv.register_dialect("SKV",SKV)
reader=csv.reader(open("samples/sample.skv"),"SKV")
fortitle,year,directorinreader:
printyear,title
如果仅仅仅是改变一两个参数,则可以直接在reader参数中设置,如下:
#File:csv-example-3.py
importcsv
reader=csv.reader(open("samples/sample.skv"),delimiter=";")
fortitle,year,directorinreader:
printyear,title
将数据存为CSV格式
通过csv.writer来生成一csv文件。
#File:csv-example-4.py
importcsv
importsys
data=[
("AndNowForSomethingCompletelyDifferent",1971,"IanMacNaughton"),
("MontyPythonAndTheHolyGrail",1975,"TerryGilliam,TerryJones"),
("MontyPython'sLifeOfBrian",1979,"TerryJones"),
("MontyPythonLiveAtTheHollywoodBowl",1982,"TerryHughes"),
("MontyPython'sTheMeaningOfLife",1983,"TerryJones")
]
writer=csv.writer(sys.stdout)
foritemindata:
writer.writerow(item)
实例
下面我们来看一个比较完整的例子,代码说明在注释中:
importcsv
#dialect是访问csv文件时需要指定的参数之一,用来确定csv文件的数据格式
#下面这个函数列举系统支持的dialect有哪些,默认值是'excel',用户也可
#以从Dialect派生一个类,使用该类的实例作为dialect参数。
printcsv.list_dialects()
deftest_writer():
#csv文件必须以二进制方式open
withopen('eggs.csv','wb')ascsvfile:
spamwriter=csv.writer(csvfile)
spamwriter.writerow(['Spam']*5+['BakedBeans'])
spamwriter.writerow(['Spam','LovelySpam','WonderfulSpam'])
deftest_reader():
withopen('eggs.csv','rb')ascsvfile:
spamreader=csv.reader(csvfile)
forrowinspamreader:
printrow
#sniffer用来推断csv文件的格式,不是很准确
deftest_sniffer():
withopen('eggs.csv','wb')ascsvfile:
spamwriter=csv.writer(csvfile,delimiter='')
spamwriter.writerow(['Spam']*2+['BakedBeans'])
spamwriter.writerow(['Spam','LovelySpam','WonderfulSpam'])
#通常你需要指定与写入者相同的文件格式才能正确的读取数据
withopen('eggs.csv','rb')ascsvfile:
spamreader=csv.reader(csvfile,delimiter='')
forrowinspamreader:
print','.join(row)
#如果不知道文件格式,sniffer就可以派上用场了
withopen('eggs.csv','rb')ascsvfile:
#用sniffer推断文件格式,从而得到dialect
dialect=csv.Sniffer().sniff(csvfile.read(1024))
printdialect.delimiter,dialect.quotechar
#文件重新移动到头部
csvfile.seek(0)
#用推断出来的dialect创建reader
reader=csv.reader(csvfile,dialect)
forrowinreader:
print','.join(row)