Python中CSV文件的读写库操作方法
目录
- 文件的基本读写
- 用字典模式处理数据
- 非标准格式的处理
- dialect
- Sniffer
CSV 格式的全称是 Comma Separated Values,意思是逗号分割的数据,是最常见的电子表格和数据库的导出格式之一,在 RFC 4180 中已经成为了一种标准格式。python 中提供了一个官方的标准库来处理这种文件类型,那就是 CSV 库。
官方文档在此:CSV
文件的基本读写
文件的读写主要使用 csv.reader
和 csv.writer
来完成,它的定义如下:
csv.reader(csvfile, dialect='excel', **fmtparams)
csvfile
:返回字符串的迭代器,一般是open
函数返回的文件对象dialect
:用来读取非标准 csv 格式的开发者_Python学习指定参数,这部分参考下文**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': www.devze.com'Cleese'}
类似地,字典的写通过 csv.DictWriter
来完成,这个函数将字典类型的数据输出为表格形式的数据,csv.DictWriter
的参数如下:
csv.DictWriter( f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds )
与 csv.DictWriter
类似,fieldnames
指定所有的字段名称,restval
用来指定当指定字段有缺失值的时候用来填充的内容,extrasaction
参数用来指定内容缺少字段javascript时的操作,默认会 '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 文件,无法直接读取,这时候我们需要指定一些额外参数来处理这些情况,这种情况下需要qYctTklCo用到 dialect
功能,这个功能包含若干类和若干函数来帮助我们实现我们的目的。
dialect
默认情况下,三个 di编程客栈alect 类型是内置的,分别是 '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
:用来分割各字段的字符,默认为,
doublequohttp://www.devze.comte
:没啥用,看不懂,待补充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 ..
到此这篇关于Python中CSV文件的读写库的文章就介绍到这了,更多相关CSV文件的读写库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论