用 Python 生成 CSV 文件

您所在的位置:网站首页 python中怎么创建文件对象 用 Python 生成 CSV 文件

用 Python 生成 CSV 文件

2024-07-11 11:55| 来源: 网络整理| 查看: 265

我们将专门使用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。

假设我们要|在示例 1的innovators.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_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"|"[email protected]" "F854"|"Susanne Briard"|"[email protected]" "E833"|"Katja Mauer"|"[email protected]"

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

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

import csv row_list = [ ["ID", "Name", "Email"], ["A878", "Alfonso K. Hamby", "[email protected]"], ["F854", "Susanne Briard", "[email protected]"], ["E833", "Katja Mauer", "[email protected]"] ] 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"|"[email protected]" "F854"|"Susanne Briard"|"[email protected]" "E833"|"Katja Mauer"|"[email protected]"

在这里,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_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),只要它们的内容结构正确。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3