在本教程中,我们将借助示例学习在 Python 中编写不同格式的 CSV 文件。


 


 


我们将专门使用csvPython 内置的模块来完成此任务。但首先,我们必须将模块导入为:

import csv

我们已经介绍了如何使用该csv模块读取和写入 CSV 文件的基础知识。如果您对使用该csv模块没有任何想法,请查看我们的Python CSV教程:读取和写入 CSV 文件


csv.writer() 的基本用法

让我们看一个csv.writer()用于刷新现有知识的基本示例。

示例 1:使用 csv.writer() 写入 CSV 文件

假设我们要编写一个包含以下条目的 CSV 文件:

SN、姓名、贡献
1、Linus Torvalds、Linux内核
2、Tim Berners-Lee,万维网
3、Guido van Rossum,Python编程

这是我们如何做到的。

import csv
with open('innovators.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["SN", "Name", "Contribution"])
    writer.writerow([1, "Linus Torvalds", "Linux Kernel"])
    writer.writerow([2, "Tim Berners-Lee", "World Wide Web"])
    writer.writerow([3, "Guido van Rossum", "Python Programming"])

当我们运行上述程序时,会在当前工作目录中创建一个具有给定条目的innovators.csv文件。

在这里,我们使用函数以写入模式打开了innovators.csv文件open()

要了解有关在 Python 中打开文件的更多信息,请访问:Python 文件输入/输出

接下来,该csv.writer()函数用于创建一个writer对象。writer.writerow()然后使用该函数将单行写入 CSV 文件。


示例 2:使用 writerows() 写入多行

如果我们需要将二维列表的内容写入 CSV 文件,我们可以这样做。

import csv
row_list = [["SN", "Name", "Contribution"],
             [1, "Linus Torvalds", "Linux Kernel"],
             [2, "Tim Berners-Lee", "World Wide Web"],
             [3, "Guido van Rossum", "Python Programming"]]
with open('protagonist.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(row_list)

程序的输出与示例 1 中的相同。

在这里,我们的二维列表被传递给writer.writerows()函数以将列表的内容写入 CSV 文件。


现在让我们看看如何编写不同格式的 CSV 文件。然后我们将学习如何自定义csv.writer()函数来编写它们。


带有自定义分隔符的 CSV 文件

默认情况下,逗号用作 CSV 文件中的分隔符。但是,某些 CSV 文件可以使用逗号以外的分隔符。很少有流行的是|\t

假设我们要|示例 1innovators.csv文件中用作分隔符。为了编写这个文件,我们可以向函数传递一个额外的参数。delimitercsv.writer()

让我们举个例子。

示例 3:写入带有管道分隔符的 CSV 文件

import csv
data_list = [["SN", "Name", "Contribution"],
             [1, "Linus Torvalds", "Linux Kernel"],
             [2, "Tim Berners-Lee", "World Wide Web"],
             [3, "Guido van Rossum", "Python Programming"]]
with open('innovators.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter='|')
    writer.writerows(data_list)

输出

SN|姓名|贡献
1|Linus Torvalds|Linux 内核
2|蒂姆·伯纳斯-李|万维网
3|Guido van Rossum|Python 编程

正如我们所见,可选参数delimiter = '|'有助于指定writerCSV 文件应具有的对象|作为分隔符。


带引号的 CSV 文件

一些 CSV 文件在每个或某些条目周围都有引号。

我们以quotes.csv为例,有以下条目:

"SN";"名称";"行情"
1;“佛陀”;“我们认为我们成为了什么”
2;“马克吐温”;“永远不要后悔任何让你微笑的事情”
3;“奥斯卡王尔德”;“做你自己,其他人都已经被带走了”

csv.writer()默认情况下使用不会将这些引号添加到条目中。

为了添加它们,我们将不得不使用另一个名为quoting.

让我们举一个例子来说明如何在非数字值周围使用引号并将其;用作分隔符。

示例 4:写入带引号的 CSV 文件

import csv
row_list = [
    ["SN", "Name", "Quotes"],
    [1, "Buddha", "What we think we become"],
    [2, "Mark Twain", "Never regret anything that made you smile"],
    [3, "Oscar Wilde", "Be yourself everyone else is already taken"]
]
with open('quotes.csv', 'w', newline='') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC, delimiter=';')
    writer.writerows(row_list)

输出

"SN";"名称";"行情"
1;“佛陀”;“我们认为我们成为了什么”
2;“马克吐温”;“永远不要后悔任何让你微笑的事情”
3;“奥斯卡王尔德”;“做你自己,其他人都已经被带走了”

在这里,quotes.csv文件是在工作目录中创建的,其中包含上述条目。

如您所见,我们已经传递csv.QUOTE_NONNUMERICquoting参数。它是csv模块定义的常量。

csv.QUOTE_NONNUMERIC指定writer应在非数字条目周围添加引号的对象。

您可以将其他 3 个预定义常量传递给quoting参数:

  • csv.QUOTE_ALL- 指定writer对象以在所有条目周围加上引号来写入 CSV 文件。
  • csv.QUOTE_MINIMAL-指定writer对象只引用那些含有特殊字符(字段分隔符quotechar或以任何字符lineterminator
  • csv.QUOTE_NONE- 指定writer不应引用任何条目的对象。它是默认值。

带有自定义引用字符的 CSV 文件

我们还可以使用自定义引用字符编写 CSV 文件。为此,我们将不得不使用一个名为 的可选参数quotechar

让我们以示例 4中编写quotes.csv文件为例,但使用*作为引用字符。

示例 5:使用自定义引用字符写入 CSV 文件

import csv
row_list = [
    ["SN", "Name", "Quotes"],
    [1, "Buddha", "What we think we become"],
    [2, "Mark Twain", "Never regret anything that made you smile"],
    [3, "Oscar Wilde", "Be yourself everyone else is already taken"]
]
with open('quotes.csv', 'w', newline='') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC,
                        delimiter=';', quotechar='*')
    writer.writerows(row_list)

输出

*SN*;*姓名*;*报价*
1;*佛陀*;*我们认为我们成为了什么*
2;*马克吐温*;*永远不要后悔任何让你微笑的事情*
3;*奥斯卡王尔德*;*做你自己,其他人都已经被带走了*

在这里,我们可以看到该quotechar='*'参数指示writer对象*用作所有非数字值的引用。


CSV 模块中的方言

请注意,在示例 5 中,我们向函数传递了多个参数(quoting,delimiterquotecharcsv.writer()

这种做法在处理一两个文件时是可以接受的。但是一旦我们开始使用多个具有相似格式的 CSV 文件,它就会使代码变得更加冗长和丑陋。

 



 



 



作为对此的解决方案,该csv模块提供dialect了一个可选参数。


方言有助于将许多特定的格式模式(如delimiterskipinitialspacequoting、 )组合escapechar到一个方言名称中。

然后它可以作为参数传递给多个writerreader实例。


示例 6:使用方言写入 CSV 文件

假设我们要编写一个包含以下内容的 CSV 文件(office.csv):

“ID”|“姓名”|“电子邮件”
"A878"|"Alfonso K. Hamby"|"alfonsokhamby@rhyta.com"
"F854"|"Susanne Briard"|"susannebriard@armyspy.com"
"E833"|"Katja Mauer"|"kmauer@jadoop.com"

CSV 文件在每个条目周围都有引号并|用作分隔符。

不是传递两个单独的格式模式,让我们看看如何使用方言来编写这个文件。

import csv
row_list = [
    ["ID", "Name", "Email"],
    ["A878", "Alfonso K. Hamby", "alfonsokhamby@rhyta.com"],
    ["F854", "Susanne Briard", "susannebriard@armyspy.com"],
    ["E833", "Katja Mauer", "kmauer@jadoop.com"]
]
csv.register_dialect('myDialect',
                     delimiter='|',
                     quoting=csv.QUOTE_ALL)
with open('office.csv', 'w', newline='') as file:
    writer = csv.writer(file, dialect='myDialect')
    writer.writerows(row_list)

输出

“ID”|“姓名”|“电子邮件”
"A878"|"Alfonso K. Hamby"|"alfonsokhamby@rhyta.com"
"F854"|"Susanne Briard"|"susannebriard@armyspy.com"
"E833"|"Katja Mauer"|"kmauer@jadoop.com"

在这里,office.csv是在工作目录中创建的,其中包含上述内容。

从这个例子中,我们可以看到该csv.register_dialect()函数用于定义自定义方言。它的语法是:

csv.register_dialect(name[, dialect[, **fmtparams]])

自定义方言需要字符串形式的名称。其他规范可以通过传递类的子类来完成,也可以Dialect通过单独的格式模式来完成,如示例中所示。


在创建writer对象时,我们通过dialect='myDialect'指定 writer 实例必须使用该特定方言。

使用的好处dialect是它使程序更加模块化。请注意,我们可以重用myDialect来编写其他 CSV 文件,而无需重新指定 CSV 格式。


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

csv.DictWriter()类的对象可用于从 Python 字典写入 CSV 文件。

csv.DictWriter()该类的最小语法是:

csv.DictWriter(file, fieldnames)

这里,

  • file - 我们要写入的 CSV 文件
  • fieldnames-list应包含列标题的对象,指定应将数据写入 CSV 文件的顺序

示例 7:Python csv.DictWriter()

import csv

with open('players.csv', 'w', newline='') as file:
    fieldnames = ['player_name', 'fide_rating']
    writer = csv.DictWriter(file, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'player_name': 'Magnus Carlsen', 'fide_rating': 2870})
    writer.writerow({'player_name': 'Fabiano Caruana', 'fide_rating': 2822})
    writer.writerow({'player_name': 'Ding Liren', 'fide_rating': 2801})

输出

该程序创建了一个player.csv文件,其中包含以下条目:

player_name,fide_rating
马格努斯卡尔森,2870
法比亚诺卡鲁阿纳,2822
丁立人,2801

csv.DictWriter()该类的完整语法是:

csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

要详细了解它,请访问:Python csv.DictWriter() 类


带有换行符的 CSV 文件

Alineterminator是用于终止writer对象生成的行的字符串。默认值为\r\n。您可以通过将任何字符串作为lineterminator参数传递来更改其值。

但是,reader对象仅识别\n\r作为lineterminator值。因此,强烈建议不要使用其他字符作为行终止符。


CSV 模块中的双引号和转义字符

为了分隔条目中的分隔符,csv模块默认使用引号引用条目。

所以,如果你有一个条目: 他是一个强壮健康的人,它会写成: “他是一个强壮、健康的人”.

类似地,该csv模块使用双引号来转义默认情况下存在于条目中的引号字符。

如果你有一个条目: 转到“programiz.com”,可以写成: "转到""programiz.com""".

在这里,我们可以看到每个"后面都跟了一个"来逃避前一个。


双引号

它处理如何quotechar引用条目本身。当 时True,引用字符加倍,当 时Falseescapechar用作 的前缀quotechar。默认情况下,其值为True

转义符

escapechar参数是一个字符串来转义分隔符,如果quoting 设置为csv.QUOTE_NONEquotechar 如果doublequote 是False。其默认值为无。

示例 8:在 csv writer 中使用转义字符

import csv
row_list = [
    ['Book', 'Quote'],
    ['Lord of the Rings',
        '"All we have to decide is what to do with the time that is given us."'],
    ['Harry Potter', '"It matters not what someone is born, but what they grow to be."']
]
with open('book.csv', 'w', newline='') as file:
    writer = csv.writer(file, escapechar='/', quoting=csv.QUOTE_NONE)
    writer.writerows(row_list)

输出

预订、报价
指环王,/“我们所要做的就是如何处理给我们的时间。/”
哈利·波特,/“重要的不是一个人的出生/,而是他们成长为什么样的人。/”

在这里,我们可以看到这/是所有"and 的前缀,,因为我们指定了quoting=csv.QUOTE_NONE.

如果未定义,则输出将是:

预订、报价
指环王,"""我们只需要决定如何处理给我们的时间。"""
哈利·波特,"""重要的不是一个人的出生,而是他们成长为什么样的人。"""

由于我们允许引用,带有特殊字符的条目("在本例中)被双引号引用。条目delimiter也包含在引号字符中。(开始和结束引号字符)

其余的引号字符将"作为字符串的一部分转义实际存在,以便它们不会被解释为quotechar。


注意: csv 模块也可以用于其他文件扩展名(如:.txt),只要它们的内容结构正确。