所谓的csv(逗号分隔值Comma Separated Values)格式是最通用的用于电子表格和数据库的导入和导出格式。因为没有“csv标准”,所以格式被读写它的许多应用程序自由定义。缺乏标准也意味着不同应用程序在产生和使用数据时总是存在一些微小的差异。这些差异使得处理来自多种源的CSV文件时令人头疼。同时,分隔符和引用符的多样性,使得所有格式足够相近以至于编写一个能够有效操作这种数据,对程序员隐藏读写数据细节的独立模块成为可能。
可以使用reader()创建一个对象从csv文件读取数据。这个阅读器可以用作一个迭代器,按顺序处理文件的行。
$ cat s_player_school_table.csv
c_school_id,c_hp_fixed,c_hp_factor,c_mana_fixed,c_mana_factor,c_ap_factor
0,150,20,140,15,1
1,90,20,140,15,1
2,180,20,151,15,1
3,229,20,177,15,4.4
4,208,20,177,15,6.7
5,208,20,177,15,6.7
$ cat read_csv.py
import csv
import sys
with open(sys.argv[1],'r') as csv_file:
csv_reader=csv.reader(csv_file)
for row in csv_reader:
print row
reader()的第一个参数是文本行的源。上例中是一个文件,也可以是任何可迭代的对象(如stringIO实例、list等等)。还可以指定其他可选参数,来控制如何解析输入数据。
$ cat read_from_list.py
import csv
csv_file=csv.reader(['hello','signjing','goodnight'])
for i in csv_file:
print i
$ python read_from_list.py
['hello']
['signjing']
['good night']
读文件时,输入数据的每一行都会解析,并转换为一个字符串list。
$ python read_csv.pys_player_school_table.csv
['c_school_id', 'c_hp_fixed','c_hp_factor', 'c_mana_fixed', 'c_mana_factor', 'c_ap_factor']
['0', '150', '20', '140', '15', '1']
['1', '90', '20', '140', '15', '1']
['2', '180', '20', '151', '15', '1']
['3', '229', '20', '177', '15', '4.4']
['4', '208', '20', '177', '15', '6.7']
['5', '208', '20', '177', '15', '6.7']
这个解析器会处理嵌在字符串中的换行符,正是这个原因,这里的行(row)并不一定等同于文件的一个输入行(line)。
$ cat s_player_school_table.csv
c_school_id,c_hp_fixed,c_hp_factor,c_mana_fixed,c_mana_factor,c_ap_factor
0,150,20,"abc
def",15,1
1,90,20,140,15,1
$ python read_csv.pys_player_school_table.csv
['c_school_id', 'c_hp_fixed','c_hp_factor', 'c_mana_fixed', 'c_mana_factor', 'c_ap_factor']
['0', '150', '20', 'abc\ndef','15', '1']
['1', '90', '20', '140', '15', '1']
由解析器返回时,输入中带换行符的字段仍保留内部换行符。
$ cat s_player_school_table.csv
c_school_id,c_hp_fixed,c_hp_factor,c_mana_fixed,c_mana_factor,c_ap_factor
0,150,20,"abc
def",15,1
1,90,20,140,15,1
$ cat attributes.py
import csv
with open('s_player_school_table.csv','r')as f:
csv_file=csv.reader(f)
for i in csv_file:
print csv_file.dialect
print i
print csv_file.line_num
print
with open('s_player_school_table.csv','r')as f:
csv_file=csv.DictReader(f)
print csv_file.fieldnames
$ python attributes.py
<_csv.Dialect object at 0xb7c64ac0>
['c_school_id', 'c_hp_fixed','c_hp_factor', 'c_mana_fixed', 'c_mana_factor', 'c_ap_factor']
1
<_csv.Dialect object at 0xb7c64ac0>
['0', '150', '20', 'abc\ndef', '15', '1']
3
<_csv.Dialect object at 0xb7c64ac0>
['1', '90', '20', '140', '15', '1']
4
['c_school_id', 'c_hp_fixed','c_hp_factor', 'c_mana_fixed', 'c_mana_factor', 'c_ap_factor']