开发者

Python中CSV文件的读写库操作方法

开发者 https://www.devze.com 2022-12-06 09:16 出处:网络 作者: 冻羊的小屋
目录文件的基本读写用字典模式处理数据非标准格式的处理dialectSnifferCSV 格式的全称是 Comma Separated Values,意思是逗号分割的数据,是最常见的电子表格和数据库的导出格式之一,在 RFC 4180 中已经成
目录
  • 文件的基本读写
  • 用字典模式处理数据
  • 非标准格式的处理
    • 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_ALLQUOTE_MINIMALQUOTE_NONNUMERICQUOTE_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文件的读写库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号