本文约2700字,建议阅读时间13~18分钟
关键字:python,逗号分隔文件,字符分割,csv
逗号分隔文件是电子表格和数据库的常用输入与输出格式。
1、相关函数
(1)csv格式数据读取
reader(csvfile,dialect=’excel’,**)其中csvfile可以是任意支持迭代并每次返回一个字符串的对象,例如文件对象和列表对象,如果csvfile是一个文件对象,那么它应该可以通过newline=’ ’打开。reader函数读取的每一行将被当作字符串列表返回。

from csv import reader
with open('read.csv',newline='') as csvfile:
csv_reader= reader(csvfile,delimiter=’ ’)
for row in csv_reader:
print(','.join(row))返回:
1,2,3,4,5,
a,b,c,d,e,f
!,@,#,,,注:
(1)open中的文件名参数为绝对路径文件名,含文件格式;
(2)每行元素以行元素最多的元素数目为准,缺失以空串填充;
(2)csv格式数据写入
writer(csvfile,dialect=’excel’,**)
from csv import writer
with open('write.csv','w',newline='') as csvfile:
csv_writer=writer(csvfile)
csv_writer.writerow(['aa','bb','cc','dd'])
csv_writer.writerow(['mm','nn','ll'])#将在当前工作目录生成write.csv文件

(3)dialect相关
注册dialect的名称
register_dialect(name[,dialect[,**]])其中name为名称字符串,备选参数dialect可以是Dialect的子类、关键词参数或者两者均包括。
删除已注册名称的dialect
unregister_dialect(name)如果name不是一个注册的dialect名称,那么将抛出Error。
返回指定名称的不可变dialect
get_dialect(name)如果name不是一个注册的dialect名称,那么将抛出Error。
返回所有已经注册的dialect名称
list_dialects()(4)字段大小的最大值
field_size_limit()#返回当前程序允许的字段大小的最大值
field_size_limit(new_limit)#设置字段大小最大值为new_limit(下次调用返回new_limit),但仍返回之前的最大值
2、相关类
(1)字典读取器:DictReader
DictReader(f,fieldnames=None,restkey=None,restval=None,dialect=’excel’,*args,**kwargs)
#当fieldnames省略时,默认取f中的第一行为相应的字段名
#当非空行元素数大于fieldnames字段数时,restkey为余下所有字段的名称,默认为None,且余下所有字段的值组成的列表作为相应的值
#当非空行元素数小于fieldnames字段数时,restval为余下所有元素的值,默认为None
#python3.8返回dict对象,python3.6返回OrderedDict对象
#从dialect及剩余的参数与reader参数相同
from csv import DictReader
with open('read.csv',newline='') as csvfile:
dict_reader=DictReader(csvfile,fieldnames=['A','B','C','D','E'])
for row in dict_reader:
print(row)返回:
{'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5', None: ['']}
{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'E': 'e', None: ['f']}
{'A': '!', 'B': '@', 'C': '#', 'D': '', 'E': '', None: ['']}(2)字典写入器:DictWriter
DictReader(f,fieldnames,restval=’’,extrasaction=’raise’,dialect=’excel’,*args,**kwargs)
#fieldnames必须给定
#restval为不在fieldnames中的字段的值,默认为’’
#当writerow方法写入字典时,如果写入字典中的键不在fieldnames中,且extrasaction为’raise’(默认值)时,则抛出ValueError,如果为’ignore’时,则忽略掉
#从dialect及剩余的参数与reader参数相同
from csv import DictWriter
with open('write.csv','w',newline='') as csvfile:
fieldnames=['A','B','C','D']
dict_writer=DictWriter(csvfile,
fieldnames=fieldnames,
restval='-',
extrasaction='ignore')
dict_writer.writerow({'A':'aa','B':'bb','C':'cc','D':'dd'})
dict_writer.writerow({'A':'mm','B':'nn','C':'ll'})
dict_writer.writerow({'A':'xx','B':'yy','E':'zz'})
#将在当前工作目录生成write.csv文件
(3)Dialect类
csv.Dialect:主要依赖于定义reader和writer参数的属性的容器类
csv.excel:定义由Excel生成的逗号分隔符文件的常用属性的类,dialect注册名称为’excel’
csv.excel_tab:定义由Excel生成的tab键分隔符文件的常用属性的类,dialect注册名称为’excel_tab’
csv.unix_dialect:定义在unix系统中生成的csv文件的常用属性的类,dialect注册名称为’unix’
(4)行特征探测类:Sniffer
sniff(sample):分析给定样本行并返回相应关键字参数的Dialect子类
from csv import Sniffer,reader
with open(file_csv,newline='') as csvfile:
dialect=Sniffer().sniff(csvfile.read(2))
csvfile.seek(0)
new_reader=reader(csvfile,dialect)
for row in new_reader:
print(','.join(row))返回:
1,2,3,4,5,
a,b,c,d,e,f
!,@,#,,,#通常不对csv文件的第一行进行探测,最好对能明显识别出分隔符的行进行探测
#主要用于不知道csv文件的关键字参数的时候使用,但需谨慎使用
has_header(sample):分析给定样本的第一行是否是字段名
3、相关常数
csv.QUOTE_ALL:写入对象时引用所有的字段
csv.QUOTE_MINIMAL:写入对象时引用那些包含特殊字符,如分隔符、配对符、终止符等的字段
csv.QUOTE_NONNUMERIC:写入对象时引用所有非数值型字段;读取对象时将非数值型字段转换为浮点型
csv.QUOTE_NONE:写入对象时不引用任何字段
4、异常:csv.Error
#相关函数中一旦某个错误被检测到,将抛出Error异常
5、Dialect与格式化参数
为了得到格式化的数据,我们可以将一些特别的格式化参数组合起来作为Dialect的属性,当然我们也可以逐个设置格式化参数来配置,并且可以重新修改相应的格式化参数。
(1)Dialect.delimiter
单个字符的字段分隔符,默认值为’,’
(2)Dialect.doublequote
控制出现在字段内的引用字符实例如何被引用,当为True时(默认值)表示双引用字符,否则在引用字符前加转义字符。在输出中,如果doublequote为False并且没有设置转义字符,在字段中发现引用字符将抛出Error
(3)Dialect.escapechar
如果引用设置为QUOTE_NONE并且引用字符的doublequote设置为False,单个字符的转义字符在写入数据时对分隔符进行转义。在读取数据时,转义字符去掉了随后字符的特别意义,该属性默认为None,即非转义
(4)Dialect.lineterminator
在写入数据时指定的行终止符,默认为’\r\n’
(5)Dialect.quotechar
用于引用包含分隔符、引用字符或者newline字符等特殊字符的字段的单个字符,默认值为空串‘‘’’
(6)Dialect.quoting
控制在写入数据时生成引用或者在读取数据时识别引用,它可以被设置成QUOTE_*中的任一常数,默认值为QUOTE_MINIMAL
(7)Dialect.skipinitialspace
当为True时,分隔符后的空白符将被忽略,默认值为False
(8)Dialect.strict
当为True时,糟糕的csv输入将抛出Error异常,默认值为False
6、读取器对象Reader
(1)公共方法
csvreader.__next__()
#返回reader迭代对象的下一行
#也可以使用next(reader)
(2)公共属性
csvreader.dialect
程序中对dialect的可读描述
csvreader.line_num
源迭代对象中读取的行数
csvreader.fieldnames
第一次读取时的字段名,仅适用于DictReader对象
7、写入器对象Writer
(1)公共方法
csvwriter.writerow(row)
#写入一行
#row为可迭代对象
csvwrite.writerows(rows)
#按照rows中每一个元素写入一行
#rows为可迭代对象,且其中每个元素亦为可迭代对象
with open(‘write.csv’,'w',newline='') as csvfile:
Writer=writer(csvfile)
Writer.writerows(['aa','bbc','cc','ddee'])生成如下csv文件:

DictWriter.writeheader()
#写入带有字段的一行
with open(file_csv,'w',newline='') as csvfile:
fieldnames=['A','B','C','D']
dict_writer=DictWriter(csvfile,
fieldnames=fieldnames,
extrasaction='ignore',
restval='-')
dict_writer.writeheader()
dict_writer.writerow({'A': 'aa', 'B': 'bb', 'C': 'cc', 'D': 'dd'})
dict_writer.writerow({'A': 'mm', 'B': 'nn', 'C': 'll'})
dict_writer.writerow({'A': 'xx', 'B': 'yy', 'E': 'zz'})返回如下文件:

(2)公共属性
csvwriter.dialect
写入数据时对dialect的可读描述
(完)
















