原文: https://howtodoinjava.com/python/python-read-write-csv-files/

学习在 Python 中使用 CSV 文件。 CSV(逗号分隔值)格式是在电子表格和数据库中使用的非常流行的导入和导出格式。 Python 语言包含csv模块,该模块具有可以读写 CSV 格式的类。

  1. Table of Contents
  2. Reading CSV file with csv.reader()
  3. Reading CSV file with csv.DictReader
  4. Writing CSV file using csv.writer()
  5. Quoting
  6. CSV Dialects
  7. Custom CSV Dialects

使用csv.reader()读取 CSV 文件

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

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

  1. 6,5,3,9,8,6,7

以下 python 脚本从此 CSV 文件读取数据。

  1. #!/usr/bin/python3
  2. import csv
  3. f = open('numbers.csv', 'r')
  4. with f:
  5. reader = csv.reader(f)
  6. for row in reader:
  7. print(row)

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

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

  1. pen|table|keyboard

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

  1. #!/usr/bin/python3
  2. import csv
  3. f = open('items.csv', 'r')
  4. with f:
  5. reader = csv.reader(f, delimiter="|")
  6. for row in reader:
  7. for e in row:
  8. print(e)

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

使用csv.DictReader读取 CSV 文件

csv.DictReader类的操作类似于常规阅读器,但是将读取的信息映射到字典中。

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

我们具有以下values.csv文件:

  1. min, avg, max
  2. 1, 5.5, 10

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

  1. #!/usr/bin/python3
  2. import csv
  3. f = open('values.csv', 'r')
  4. with f:
  5. reader = csv.DictReader(f)
  6. for row in reader:
  7. print(row)

上面的 python 脚本使用csv.DictReadervalues.csv文件读取值。

这是示例的输出。

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

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

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

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

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

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

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

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

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

  1. #!/usr/bin/python3
  2. import csv
  3. nms = [[1, 2, 3], [7, 8, 9], [10, 11, 12]]
  4. f = open('numbers3.csv', 'w')
  5. with f:
  6. writer = csv.writer(f)
  7. writer.writerows(nms)

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

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

引用

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

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

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

  1. #!/usr/bin/python3
  2. import csv
  3. f = open('items2.csv', 'w')
  4. with f:
  5. writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
  6. writer.writerows((["coins", 3], ["pens", 2], ["bottles", 7]))

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

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

CSV 方言

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

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

  1. #!/usr/bin/python3
  2. import csv
  3. names = csv.list_dialects()
  4. for name in names:
  5. print(name)
  6. dialect = csv.get_dialect(name)
  7. print(repr(dialect.delimiter), end=" ")
  8. print(dialect.doublequote, end=" ")
  9. print(dialect.escapechar, end=" ")
  10. print(repr(dialect.lineterminator), end=" ")
  11. print(dialect.quotechar, end=" ")
  12. print(dialect.quoting, end=" ")
  13. print(dialect.skipinitialspace, end=" ")
  14. print(dialect.strict)

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

  1. $ ./dialects.py
  2. excel
  3. ',' 1 None '\r\n' " 0 0 0
  4. excel-tab
  5. '\t' 1 None '\r\n' " 0 0 0
  6. unix
  7. ',' 1 None '\n' " 1 0 0

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

自定义 CSV 方言

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

  1. #!/usr/bin/python3
  2. import csv
  3. csv.register_dialect("hashes", delimiter="#")
  4. f = open('items3.csv', 'w')
  5. with f:
  6. writer = csv.writer(f, dialect="hashes")
  7. writer.writerow(("pencils", 2))
  8. writer.writerow(("plates", 1))
  9. writer.writerow(("books", 4))

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

程序生成以下文件(items3.csv):

  1. pencils#2
  2. plates#1
  3. books#4

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

学习愉快!

该教程由运行 zetcode.com 的 Jan Bodnar 编写。