Python 读写 CSV 文件

本文介绍如何在 Python 中使用 CSV 文件。CSV(逗号分隔值,Comma-Separated Values)格式是电子表格和数据库中非常流行的导入和导出格式。Python 内置了 csv 模块,提供了用于读取和写入 CSV 格式数据的类 (csv)。

系列教程导航

  1. Python 基础教程
  2. 在 SublimeEditor 中配置 Python 环境
  3. Python 代码中添加注释
  4. Python 中的变量的使用
  5. Python 中的数据类型
  6. Python 中的关键字
  7. Python 字符串操作
  8. Python 中的 list 操作
  9. Python 中的 Tuple 操作
  10. Python max()和 min()–在列表或数组中查找最大值和最小值
  11. Python 找到最大的 N 个(前 N 个)或最小的 N 个项目
  12. Python 读写 CSV 文件
  13. Python 中使用 httplib2–HTTP GET 和 POST 示例
  14. Python 将 tuple 开箱为变量或参数
  15. Python 开箱 Tuple–太多值无法解压
  16. Python multidict 示例–将单个键映射到字典中的多个值
  17. Python OrderedDict–有序字典
  18. Python 字典交集–比较两个字典
  19. Python 优先级队列示例

目录

使用 csv.reader() 读取 CSV

csv.reader() 方法返回一个 reader 对象,该对象将遍历给定 CSV 文件中的行。

假设我们有以下 numbers.csv 文件,其中包含数字:

6,5,3,9,8,6,7 

以下 Python 脚本从此 CSV 文件读取数据:

#!/usr/bin/python3

import csv
f = open('numbers.csv', 'r')
with f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

在上面的代码示例中,我们打开了 numbers.csv 以读取并使用 csv.reader() 方法加载数据。

现在,假设 CSV 文件将使用其他定界符。(严格来说,这不是标准的 CSV 文件,但是这种做法很常见。)例如,我们有以下 items.csv 文件,其中的元素由竖线字符(|)分隔:

pen|table|keyboard

以下脚本从 items.csv 文件读取数据:

#!/usr/bin/python3

import csv
f = open('items.csv', 'r')
with f:
    reader = csv.reader(f, delimiter="|")
    for row in reader:
        for e in row:
            print(e)

我们在 csv.reader() 方法中使用 delimiter 参数指定新的分隔字符。

使用 csv.DictReader 读取 CSV

csv.DictReader 类的运作就像一个普通的 reader,但将信息映射到字典中

字典的键可以与 fieldnames 参数一起传递,也可以从 CSV 文件的第一行推断出来。

我们有以下 values.csv 文件:

min, avg, max
1, 5.5, 10

第一行代表字典的键,第二行代表值。

#!/usr/bin/python3

import csv
f = open('values.csv', 'r')
with f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)

上面的 Python 脚本使用 csv.DictReader 读取 values.csv 文件中的值。

这是示例的输出:

$ ./read_csv3.py 
{' max': ' 10', 'min': '1', ' avg': ' 5.5'}

使用 csv.writer() 写入 CSV 文件

csv.writer() 方法返回一个 writer 对象,该对象负责将用户数据转换为给定文件状对象上的定界字符串。

#!/usr/bin/python3

import csv
nms = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
f = open('numbers2.csv', 'w')
with f:
    writer = csv.writer(f)
    for row in nms:
        writer.writerow(row)

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

该脚本将产生以下文件(numbers2.csv):

1,2,3,4,5,6
7,8,9,10,11,12

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

下一个代码示例将 Python 列表写入 numbers3.csv 文件。该脚本将三行数字写入文件:

#!/usr/bin/python3

import csv
nms = [[1, 2, 3], [7, 8, 9], [10, 11, 12]]
f = open('numbers3.csv', 'w')
with f:
    writer = csv.writer(f)
    writer.writerows(nms)

运行上述程序时,以下输出将写入 numbers3.csv 文件:

1,2,3
7,8,9
10,11,12

引用模式 (Quoting)

可以在 CSV 文件中引用单词。Python CSV 模块中有四种不同的引用模式

  • QUOTE_ALL — 引用所有字段
  • QUOTE_MINIMAL — 仅引用那些包含特殊字符的字段
  • QUOTE_NONNUMERIC — 引用所有非数字字段
  • QUOTE_NONE — 不引用字段

在下一个示例中,我们向 items2.csv 文件写入三行。所有非数字字段都用引号引起来:

#!/usr/bin/python3

import csv
f = open('items2.csv', 'w')
with f:
    writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerows((["coins", 3], ["pens", 2], ["bottles", 7]))

该程序将创建以下 items2.csv 文件。引用项目名称,不引用数字表示的数量:

"coins",3
"pens",2
"bottles",7

CSV 方言 (Dialects)

尽管 CSV 格式是一种非常简单的格式,但还是有许多差异,例如不同的定界符、换行或引号字符。因此,有不同的 CSV 方言(Dialects)可用。

下一个代码示例将打印可用的方言及其特征:

#!/usr/bin/python3

import csv
names = csv.list_dialects()
for name in names:
    print(name)
    dialect = csv.get_dialect(name)
    print(repr(dialect.delimiter), end=" ")
    print(dialect.doublequote, end=" ")
    print(dialect.escapechar, end=" ")
    print(repr(dialect.lineterminator), end=" ")
    print(dialect.quotechar, end=" ")
    print(dialect.quoting, end=" ")
    print(dialect.skipinitialspace, end=" ")
    print(dialect.strict)

csv.list_dialects() 返回方言名称的列表,csv.get_dialect() 方法返回与方言名称相关联的方言对象。

$ ./dialects.py 
excel
',' 1 None '\r\n' " 0 0 0
excel-tab
'\t' 1 None '\r\n' " 0 0 0
unix
',' 1 None '\n' " 1 0 0

程序将打印此输出。有三个内置的方言:excelexcel-tabunix

自定义 CSV 方言

在本教程的最后一个示例中,我们将创建一个自定义方言。使用 csv.register_dialect() 方法创建自定义方言:

#!/usr/bin/python3

import csv
csv.register_dialect("hashes", delimiter="#")
f = open('items3.csv', 'w')
with f:
    writer = csv.writer(f, dialect="hashes")
    writer.writerow(("pencils", 2))
    writer.writerow(("plates", 1))
    writer.writerow(("books", 4))

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

该程序将产生以下文件(items3.csv):

pencils#2
plates#1
books#4

在本教程中,我们探索了 Python csv 模块,并介绍了一些在 Python 中读写 CSV 文件的示例。

学习愉快!

说明:本文代码示例基于 Python 3 环境。csv 模块为 Python 标准库,兼容性较好。