CSV:CSV文件的读写库
CSV 格式的全称是 Comma Separated Values,意思是逗号分割的数据,是最常见的电子表格和数据库的导出格式之一,在 RFC 4180 中已经成为了一种标准格式。Python 中提供了一个官方的标准库来处理这种文件类型,那就是 CSV 库。
官方文档在此:CSV
文件的基本读写
文件的读写主要使用 csv.reader
和 csv.writer
来完成,它的定义如下:
csv.reader(csvfile, dialect='excel', **fmtparams)
csvfile
:返回字符串的迭代器,一般是open
函数返回的文件对象dialect
:用来读取非标准 csv 格式的指定参数,这部分参考下文**fmtparams
:用来指定格式的参数,这部分的详细参数参考下文
最简单、最常用的使用方法是将 open
函数返回的文件对象直接丢给 csv.reader
就会得到一个每次返回一个拆分后的字符串列表的迭代器:
import csv
with open('file.csv', 'r') as input_file:
file_content = csv.reader(input_file, delemiter=',')
for row in file_content:
# code here
pass
类似地,对文件的写操作与原生方法类似:
import csv
with open('file.csv', 'w', newline='') as output_file:
file_writer = csv.writer(output_file, delimiter=',')
file_writer.writerow(['Spam'] * 5 + ['Baked Beans'])
file_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
用字典模式处理数据
有时候,我们可能需要将数据读取成字典(例如要上传到 MongoDB 的时候),这时候我们可以使用 csv.DictReader
将表格形式的数据读取为字典形式的数据。
这个函数的参数如下:
csv.DictReader(
f,
fieldnames=None,
restkey=None, restval=None,
dialect='excel',
*args, **kwds
)
f
:可迭代对象或者文件对象fieldnames
:一个有序列表,代表字典中的字段(一般是文件的列名),如果不指定,就用文件的第一行的字符串来作为字段的名字restkey
:如果列名的数量少于内容的列数,那么剩下的列就会被统一放到一个字段里,这里的restkey
就是这个字段的名字,默认为None
restval
:与restkey
类似,如果内容的列数少于列名的数量,那么内容中缺少的列就会被填充,这个参数指定用来填充的值,默认为None
- 其他的参数与
csv.reader
相同
一个简单的示例如下:
import csv
with open('file.csv') as input_file:
reader = csv.DictReader(input_file)
for row in reader:
print(row['first_name'], row['last_name'])
# Eric Idle
# John Cleese
print(row)
# {'first_name': 'John', 'last_name': 'Cleese'}
类似地,字典的写通过 csv.DictWriter
来完成,这个函数将字典类型的数据输出为表格形式的数据,csv.DictWriter
的参数如下:
csv.DictWriter(
f,
fieldnames,
restval='', extrasaction='raise',
dialect='excel',
*args, **kwds
)
与 csv.DictWriter
类似,fieldnames
指定所有的字段名称,restval
用来指定当指定字段有缺失值的时候用来填充的内容,extrasaction
参数用来指定内容缺少字段时的操作,默认会 'raise'
,即引发一个 ValueError
异常,可以设置为 'ignore'
,对应着忽略额外值,一个示例如下:
import csv
with open('names.csv', 'w', newline='') as output_file:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(output_file, fieldnames=fieldnames)
# 将
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
非标准格式的处理
有时候,csv 的文件可能不是标准的 csv 文件,无法直接读取,这时候我们需要指定一些额外参数来处理这些情况,这种情况下需要用到 dialect
功能,这个功能包含若干类和若干函数来帮助我们实现我们的目的。
dialect
默认情况下,三个 dialect 类型是内置的,分别是 'unix'
、'excel'
、和 'excel_tab'
。'unix'
模式用来处理在 Unix 系统下生成的文件,而 'excel'
模式用来处理 excel 生成的 csv 文件,最后的 'excel_tab'
用来处理 excel 生成的制表符分割的文件,这三种预设已经覆盖了绝大多数的使用场景。
用户可以使用 Dialect 类来自定格式的处理:
csv.register_dialect(
'unixpwd',
delimiter=',',
quoting=csv.QUOTE_MINIMAL,
quotechar='"',
doublequote=True,
escapechar=None,
lineterminator='\r\n',
skipinitialspace=False,
strict=False
)
name
:自定义的格式名称delimiter
:用来分割各字段的字符,默认为,
doublequote
:没啥用,看不懂,待补充escapechar
:没啥用,一般不用lineterminator
:换行符,默认是'\r\n'
quotechar
:当字段含有特殊字符是,用来引用的符号,默认是"
,不用改,不常用quoting
:加引号的行为,可以选择QUOTE_ALL
、QUOTE_MINIMAL
、QUOTE_NONNUMERIC
、QUOTE_NONE
四种行为skipinitialspace
:是否跳过分隔符后面的空格,默认为False
strict
:严格模式,如果为 True,文件格式不对的时候会报错终止,否则会强制读取
使用方法就是先使用csv.register_dialect
注册一个自定义dialect,然后在reader里面指定它:
import csv
csv.register_dialect(
'unixpwd',
delimiter=':',
quoting=csv.QUOTE_NONE,
...
)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
Sniffer
正如它的名字,sniffer
提供了对格式的自动检测,并输出一个 dialect
,提供了两个函数,分别是 has_header
,用来检测文件是否包含标题行,和主函数 sniff
,这里通过一个例子来学习它的使用:
with open('example.csv', newline='') as csvfile:
# 通过文件的前1024行来确定文件的格式规范
dialect = csv.Sniffer().sniff(csvfile.read(1024))
# 将指针重置,从文件开始进行读取
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... process CSV file contents here ..
本文来自博客园,作者:冻羊,转载请注明原文链接:https://www.cnblogs.com/wdyyy/p/python_csv.html