在本教程中,我们将借助示例学习在 Python 中编写不同格式的 CSV 文件。
我们将专门使用csv
Python 内置的模块来完成此任务。但首先,我们必须将模块导入为:
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
。
假设我们要|
在示例 1的innovators.csv文件中用作分隔符。为了编写这个文件,我们可以向函数传递一个额外的参数。delimiter
csv.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 = '|'
有助于指定writer
CSV 文件应具有的对象|
作为分隔符。
带引号的 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_NONNUMERIC
了quoting
参数。它是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
,delimiter
和quotechar
)csv.writer()
。
这种做法在处理一两个文件时是可以接受的。但是一旦我们开始使用多个具有相似格式的 CSV 文件,它就会使代码变得更加冗长和丑陋。
作为对此的解决方案,该csv
模块提供dialect
了一个可选参数。
方言有助于将许多特定的格式模式(如delimiter
、skipinitialspace
、quoting
、 )组合escapechar
到一个方言名称中。
然后它可以作为参数传递给多个writer
或reader
实例。
示例 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
,引用字符加倍,当 时False
,escapechar
用作 的前缀quotechar
。默认情况下,其值为True
。
转义符
escapechar
参数是一个字符串来转义分隔符,如果quoting 设置为csv.QUOTE_NONE
quotechar 如果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),只要它们的内容结构正确。