ZetCode

Python CSV - 读取写入 CSV

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何使用 Python csv 模块读取和写入 CSV 数据。

CSV

CSV (Comma Separated Values,逗号分隔值) 是一种非常流行的导入和导出数据格式,用于电子表格和数据库。CSV 文件中的每一行都是一个数据记录。每个记录由一个或多个字段组成,字段之间用逗号分隔。虽然 CSV 是一种非常简单的数据格式,但可能存在许多差异,例如不同的分隔符、换行符或引用字符。

Python csv 模块

csv 模块实现了用于以 CSV 格式读取和写入表格数据的类。csv 模块的 readerwriter 对象读取和写入序列。程序员还可以使用 DictReaderDictWriter 类以字典形式读取和写入数据。

Python CSV 方法

下表显示了 Python csv 方法

方法描述
csv.reader返回一个 reader 对象,该对象迭代 CSV 文件的行
csv.writer返回一个 writer 对象,该对象将数据写入 CSV 文件
csv.register_dialect注册 CSV 方言
csv.unregister_dialect注销 CSV 方言
csv.get_dialect返回具有给定名称的方言
csv.list_dialects返回所有已注册的方言
csv.field_size_limit返回解析器允许的当前最大字段大小

使用 Python csv 模块

import csv

要使用 Python CSV 模块,我们需要导入 csv

Python CSV reader

csv.reader 方法返回一个 reader 对象,该对象迭代给定 CSV 文件中的行。

$ cat numbers.csv
16,6,4,12,81,6,71,6

numbers.csv 文件包含数字。

read_csv.py
#!/usr/bin/python

import csv

with open('numbers.csv', 'r') as f:

    reader = csv.reader(f)

    for row in reader:
        for e in row:
            print(e)

在代码示例中,我们打开 numbers.csv 进行读取,并读取其内容。

reader = csv.reader(f)

我们获取 reader 对象。

for row in reader:
    for e in row:
        print(e)

通过两个 for 循环,我们迭代数据。

$ ./read_csv.py
16
6
4
12
81
6
71
6

使用不同分隔符的 Python CSV reader

csv.reader 方法允许使用其 delimiter 属性使用不同的分隔符。

$ cat items.csv
pen|cup|bottle
chair|book|tablet

items.csv 包含用 '|' 字符分隔的值。

read_csv.py
#!/usr/bin/python

import csv

with open('items.csv', 'r') as f:

    reader = csv.reader(f, delimiter="|")

    for row in reader:

        for e in row:
            print(e)

该代码示例从使用 '|' 分隔符的 CSV 文件中读取和显示数据。

$ ./read_csv2.py
pen
cup
bottle
chair
book
tablet

Python CSV DictReader

csv.DictReader 类的工作方式与常规 reader 类似,但将读取的信息映射到字典中。可以通过 fieldnames 参数传入字典的键,也可以从 CSV 文件的第一行推断出来。

$ cat values.csv
min,avg,max
1, 5.5, 10
2, 3.5, 5

该文件的第一行由字典键组成。

read_csv_dictionary.py
#!/usr/bin/python

# read_csv3.py

import csv

with open('values.csv', 'r') as f:

    reader = csv.DictReader(f)

    for row in reader:
        print(row['min'], row['avg'], row['max'])

该示例使用 csv.DictReadervalues.csv 文件中读取值。

for row in reader:
    print(row['min'], row['avg'], row['max'] )

该行是一个 Python 字典,我们使用键引用数据。

Python CSV writer

csv.writer 方法返回一个 writer 对象,该对象将用户的数据转换为给定类文件对象上的分隔字符串。

write_csv.py
#!/usr/bin/python

import csv

nms = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]

with open('numbers2.csv', 'w') as f:

    writer = csv.writer(f)

    for row in nms:
        writer.writerow(row)

该脚本将数字写入 numbers2.csv 文件。 writerow 方法将一行数据写入指定的文件。

$ cat numbers2.csv
1,2,3,4,5,6
7,8,9,10,11,12

可以一次写入所有数据。 writerows 方法将所有给定的行写入 CSV 文件。

write_csv2.py
#!/usr/bin/python

import csv

nms = [[1, 2, 3], [7, 8, 9], [10, 11, 12]]

with open('numbers3.csv', 'w') as f:

    writer = csv.writer(f)
    writer.writerows(nms)

该代码示例使用 writerows 方法将三行数字写入文件。

Python CSV DictWriter

csv.DictWriter 类的工作方式与常规 writer 类似,但将 Python 字典映射到 CSV 行。 fieldnames 参数是一个键序列,用于标识传递给 writerow 方法的字典中的值写入 CSV 文件的顺序。

write_csv_dictionary.py
#!/usr/bin/python

import csv

with open('names.csv', 'w') as f:

    fnames = ['first_name', 'last_name']
    writer = csv.DictWriter(f, fieldnames=fnames)

    writer.writeheader()
    writer.writerow({'first_name' : 'John', 'last_name': 'Smith'})
    writer.writerow({'first_name' : 'Robert', 'last_name': 'Brown'})
    writer.writerow({'first_name' : 'Julia', 'last_name': 'Griffin'})

该示例使用 csv.DictWriter 将 Python 字典中的值写入 CSV 文件。

writer = csv.DictWriter(f, fieldnames=fnames)

创建新的 csv.DictWriter。标头名称传递给 fieldnames 参数。

writer.writeheader()

writeheader 方法将标头写入 CSV 文件。

writer.writerow({'first_name' : 'John', 'last_name': 'Smith'})

Python 字典写入 CSV 文件中的一行。

$ cat names.csv
first_name,last_name
John,Smith
Robert,Brown
Julia,Griffin

Python CSV 自定义方言

使用 csv.register_dialect 方法创建自定义方言。

custom_dialect.py
#!/usr/bin/python

import csv

csv.register_dialect("hashes", delimiter="#")

with open('items3.csv', 'w') as f:

    writer = csv.writer(f, dialect="hashes")
    writer.writerow(("pens", 4))
    writer.writerow(("plates", 2))
    writer.writerow(("bottles", 4))
    writer.writerow(("cups", 1))

该程序使用 (#) 字符作为分隔符。使用 csv.writer 方法中的 dialect 选项指定方言。

$ cat items3.csv
pens#4
plates#2
bottles#4
cups#1

生成虚假的 CSV 数据

在下一个示例中,我们将创建一个新的 CSV 文件,其中填充了虚假数据。虚假数据对于测试很有用。

我们使用 faker 模块来生成虚假数据。

fake_csv.py
#!/usr/bin/python

from faker import Faker
import csv

faker = Faker()

with open('users.csv', 'w', newline='') as f:

    fieldnames = ['id', 'first_name', 'last_name', 'occupation']
    writer = csv.DictWriter(f, fieldnames=fieldnames)

    writer.writeheader()

    for i in range(1, 101, 1):
        _id = i
        fname = faker.first_name()
        lname = faker.last_name()
        occupation = faker.job()

        writer.writerow({'id': _id, 'first_name': fname, 
            'last_name': lname, 'occupation': occupation})

该示例创建 100 个用户。用户以 CSV 格式写入 users.csv 文件。

来源

CSV 文件读取和写入 - 语言参考

在本文中,我们使用了 Python 中的 CSV。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程