亲宝软件园·资讯

展开

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

冻羊的小屋 人气:0

CSV 格式的全称是 Comma Separated Values,意思是逗号分割的数据,是最常见的电子表格和数据库的导出格式之一,在 RFC 4180 中已经成为了一种标准格式。Python 中提供了一个官方的标准库来处理这种文件类型,那就是 CSV 库。

官方文档在此:CSV

文件的基本读写

文件的读写主要使用 csv.reader 和 csv.writer 来完成,它的定义如下:

csv.reader(csvfile, dialect='excel', **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
)

一个简单的示例如下:

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
)

使用方法就是先使用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 ..

加载全部内容

相关教程
猜你喜欢
用户评论