csv 格式是数据库和电子表格最常用的导入和导出格式。本教程将介绍python 中的 csv 模块。我们将了解它为您提供的所有函数和类,用于将数据读取和写入 CSV 文件。我们还提供了一些工作示例,向您展示如何在 Python 中读取和写入数据到实际的 CSV 文件。
什么是 CSV 文件?
CSV 一词代表逗号分隔值。CSV 格式文件允许将数据保存在具有.csv扩展名的表格结构中。CSV 文件已广泛用于电子商务应用程序,因为它们被认为非常易于处理。它们被使用的一些领域包括:
导入和导出客户数据
进出口产品
出口订单
导出电子商务分析报告
读取器和写入器函数
csv 模块有几个函数和类可用于处理 CSV 文件。让我们从学习如何使用reader()和writer()函数开始。
csv.reader
此函数返回一个读取器对象,该对象遍历给定 CSV 文件中的所有行。该csv.reader()函数采用以下参数:
csvfile:第一个参数可以是任何支持迭代器协议的对象,每次__next__()调用其方法时返回一个字符串。
dialect='excel': 一个可选参数,用于定义一组特定于特定 CSV 方言的参数。默认设置为excel。list_dialects()您可以通过调用该函数获取所有注册方言的名称。
fmtparams:第三个参数表示您可以选择传递多个关键字参数。它们对于覆盖当前方言中的各个格式参数很有用。
这是一个非常简单的示例,展示了如何使用该csv.reader()函数。
import csv with open('people.csv', newline='') as File: reader = csv.reader(File) for row in reader: print(row)
您在打开example.csvnewline=''时注意到传递给了吗?理想情况下,如果它是一个文件,您应该如何打开它。open()csvfile
csv.writer
此函数返回一个 writer 对象,该对象具有一堆帮助方法来帮助您将数据写入 CSV 文件。该功能与功能类似csv.reader()。它采用以下参数:
csvfile: 这 可以 是任何带有write()方法的对象。newline=''同样,如果它是文件对象,您应该使用参数打开它。
dialect='excel': 一个可选参数,用于定义一组特定于特定 CSV 的参数。
fmtparam:这只是表明您可以传递一堆可选的关键字参数来覆盖当前方言的行为。
DictReader和DictWriter类
来自csv模块的DictReader和DictWriter类也有助于读取和写入 CSV 文件。尽管它们类似于读取器和写入器函数,但这些类使用字典对象来读取和写入数据。
DictReader
该类DictReader创建一个对象,它将给定文件的每一行中的信息映射到一个字典,其键可以由可选fieldnames参数指定。如果省略该fieldnames参数,则第一行中的值将用作键。
这是一个非常基本的示例,它使用该类读取名为people.csv的文件的内容。DictReader
import csv with open('people.csv', newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row['Name'], row['Occuption'])
理想情况下,文件中的行数与您在fieldnames参数中传递的字段数相同。如果不是这种情况会发生什么?这里有两种可能。
首先,您正在阅读的行的字段比fieldnames. 在这种情况下,剩余的数据将被放入一个列表中,然后存储在一个字段名中,其值由restkey参数确定。其次,一行的字段少于fieldnames. 在这种情况下,将使用您为参数指定的值填充缺失值restval。
DictWriter
该类DictWriter创建一个对象,该对象将字典映射到要输出或写入文件的行。就像DictReader,这个类也接受fieldnames它的第二个参数。内部不同字段fieldnames的顺序决定了将不同字典中的值传递给writerow()方法的顺序。
与DictReader类不同,fieldnames参数 inDictWriter不是可选的。这是有道理的,因为某些字典可能有一组不同的键,并且使用fieldnames参数将清除这些键使用的任何歧义。
您要写入 CSV 文件的字典可能缺少fieldnames. 在这种情况下,该值由可选restval参数确定。如果任何字典有一个额外的键,这不在 中fieldnames,您可以使用该extrasaction键来指定要执行的操作。默认行为是引发ValueError异常。
方言和格式
方言是一个帮助类,用于定义特定reader或writer实例的参数。调用读取器或写入器函数或方法时需要声明方言和格式参数。
方言支持几个属性:
delimiter:用于分隔字段的单字符字符串。它默认为','.
quotechar:用于引用包含特殊字符的字段的单字符字符串。这包括delimiter或quotechar字符。它默认为. '"'
doublequote:控制应如何引用出现在字段中的quotechar实例。可以是True或False。请记住,如果doublequote设置为 ,则必须设置escapechar的值。False
escapechar:如果quoting设置为,作者用来转义分隔符的字符串。QUOTE_NONE
lineterminator: 用于终止由writer. 它默认为'\r\n'.
skipinitialspace: 如果设置为True,则紧跟分隔符的任何空格都将被忽略。
strict:如果设置为,则会在错误的 CSV 输入时引发异常错误。 True
quoting:控制在读取或写入 CSV 时应生成引号的时间。
quoting属性可以具有四个可能的值之一。这些是:
QUOTE_ALL:这告诉writer引用所有字段。
QUOTE_MINIMAL:这告诉writer只引用那些包含特殊字符(如分隔符或quotechar字符)的字段。
QUOTE_NONNUMERIC:这告诉writer引用所有非数字字段并将数字字段转换为浮点数。
QUOTE_NONE:这告诉writer永远不要引用任何字段。
读取 CSV 文件
让我们看看如何使用我们上面讨论过的函数和类来读取 CSV 文件。
我们将使用一个名为state-data.csv的 CSV 文件,其中包含有关美国不同州的信息。这里我们有我们的 CSV 文件,其中包含州名、首都、最大城市和人口。
下面是使用csv.reader函数和csv.DictReader类读取 CSV 中数据的代码。
读取 CSV 文件csv.reader
import csv with open('state-data.csv', newline='') as state_file: reader = csv.reader(state_file) for row in reader: print(row)
在上面的代码中,我们导入 csv 模块,然后将 CSV 文件打开为state_file. 然后我们定义读取器对象并使用该csv.reader()函数将数据提取到对象中。然后我们遍历reader对象并检索我们数据的每一行。
我们通过将其内容打印到控制台来显示读取的数据。您可以看到各个行中的数据已作为列表返回。
输出
['Name', 'Capital City', 'Largest City', 'Population'] ['Alabama', 'Montgomery', 'Huntsville', '5024279'] ['Alaska', 'Juneau', 'Anchorage', '733391'] ['Arizona', 'Phoenix', 'Phoenix', '7151502'] ['Arkansas', 'Little Rock', 'Little Rock', '3011524']
使用 DictReader 读取 CSV 文件
正如我上面提到的,DictReader该类允许我们通过将数据映射到字典来读取 CSV 文件,而不是像csv.reader()函数那样返回列表。以下是使用DictReader该类读取 CSV 文件的方法。
import csv with open('state-data.csv', newline='') as state_file: reader = csv.DictReader(state_file) for row in reader: print(row)
像往常一样,我们首先导入 csv 模块。然后我们定义读取器对象并使用DictReader该类将数据提取到对象中。然后我们遍历reader对象并检索我们数据的每一行。
最后,我们将读取的数据输出到控制台。您可以看到这次单独的行中的数据作为字典返回。
输出
{'Name': 'Alabama', 'Capital City': 'Montgomery', 'Largest City': 'Huntsville', 'Population': '5024279'} {'Name': 'Alaska', 'Capital City': 'Juneau', 'Largest City': 'Anchorage', 'Population': '733391'} {'Name': 'Arizona', 'Capital City': 'Phoenix', 'Largest City': 'Phoenix', 'Population': '7151502'} {'Name': 'Arkansas', 'Capital City': 'Little Rock', 'Largest City': 'Little Rock', 'Population': '3011524'}
使用DictReader类更好,因为它将我们的数据输出为字典,在某些情况下更容易使用。
fieldnames在前面的示例中,我们没有为参数传递任何值,因此DictReader将第一行中的字段用作字典键。这次让我们传递一个列表作为fieldnames参数的值。我故意从列表中省略了最大城市和人口fieldnames,以向您展示DictReader在这种情况下的行为方式。我还为参数传递了一个值,restkey因为每行中的项目比fieldnames.
import csv fields = ['Name', 'Capital City'] with open('state-data.csv', newline='') as state_file: reader = csv.DictReader(state_file, fields, restkey='Extra Data') for row in reader: print(row)
上面的代码给出了以下输出:
{'Name': 'Name', 'Capital City': 'Capital City', 'Extra Data': ['Largest City', 'Population']} {'Name': 'Alabama', 'Capital City': 'Montgomery', 'Extra Data': ['Huntsville', '5024279']} {'Name': 'Alaska', 'Capital City': 'Juneau', 'Extra Data': ['Anchorage', '733391']} {'Name': 'Arizona', 'Capital City': 'Phoenix', 'Extra Data': ['Phoenix', '7151502']} {'Name': 'Arkansas', 'Capital City': 'Little Rock', 'Extra Data': ['Little Rock', '3011524']}
由于我们已经在 中传递了字典键fieldnames,因此第一行不再用于创建键,而是作为字典输出。另请注意,每行中的所有额外值现在都存储在列表中并分配给字典中的键Extra Data。
写入 CSV 文件
现在让我们看看如何使用本教程开头讨论的csv.writer()函数和类将数据写入 CSV 文件。Dictwriter
使用写入 CSV 文件csv.writer
下面的代码将定义的数据写入state-data.csv文件。
import csv state_info = ["California", "Sacramento", "Los Angeles", "39538223"] with open('state-data.csv', 'a', newline='') as state_file: writer = csv.writer(state_file) writer.writerow(state_info)
首先我们导入 csv 模块,该writer()函数将创建一个适合写入的对象。我们使用该方法writerow()是因为我们想要将其数据写入文件的单行。
这是我们的 CSV,其中包含我们写入的数据。
使用 DictWriter 写入 CSV 文件
让我们将以下数据写入我们的 CSV 文件。它在列表中包含有关美国三个不同州的信息,其中单个元素是字典。
state_info = [ { "Name": "Colorado", "Largest City": "Denver", "Capital City": "Denver", "Population": "5773714" }, { "Name": "Connecticut", "Largest City": "Hartford", "Capital City": "Bridgeport", "Population": "3605944" }, { "Name": "Delaware", "Largest City": "Dover", "Capital City": "Wilmington", "Population": "989948" } ]
代码如下所示。
import csv fields = ['Name', 'Capital City', 'Largest City', 'Population']; with open('state-data.csv', 'a', newline='') as state_file: writer = csv.DictWriter(state_file, fields) writer.writerows(state_info)
我们首先将字段名定义为列表并将它们存储在fields变量中。这让writer对象知道 CSV 文件中每一列的标题是什么。该writerows()方法会将我们提供给它的所有行一次写入 CSV 文件。唯一的条件writerows()是我们要写入的行是可迭代的。
writer()如果我们像在前面的示例中那样使用函数,那么每个单独的行本身也应该是字符串或数字的可迭代对象。否则,每一行都应该是一个映射fieldnames到字符串或数字的字典,以便DictWriter类处理它。
现在让我们尝试将以下数据写入我们的 CSV 文件:
state_info = [ { "Name": "Florida", "Capital City": "Tallahassee" }, { "Name": "Georgia", "Area": "153910", "Largest City": "Atlanta", "Population": "10711908", "Capital City": "Atlanta", } ]
上述数据有两点值得注意。首先,我们的佛罗里达州缺少一些信息。其次,乔治亚州有一些基于我们在表中存储的额外信息。第三,佐治亚州的键与我们为 CSV 文件定义字段的顺序不同。
我们如何处理这样的非标准数据?该DictWriter课程提供了一个解决方案。对于缺少的键,我们可以简单地使用restval参数提供一个默认值。默认设置为空字符串。但是,您也可以指定自定义值,例如Unknown。对于额外的键,您可以使用extrasaction参数来告诉DictWriter忽略这些键。默认情况下,此参数将引发 a ValueError。
这是一次写入所有行的方法。
import csv fields = ['Name', 'Capital City', 'Largest City', 'Population'] with open('state-data.csv', 'a', newline='') as state_file: writer = csv.DictWriter(state_file, fields, restval='Unknown', extrasaction='ignore') writer.writerows(state_info)
完成所有写入操作后,我们的 CSV 文件将如下所示:
结论
本教程涵盖了使用 Python 提供的不同函数和类成功读取和写入 CSV 文件所需的大部分内容。CSV 文件已广泛用于软件应用程序,因为它们易于阅读和管理,而且它们的小尺寸使其处理和传输速度相对较快。
- csv.reader
- csv.writer
- DictReader
- DictWriter
- 读取 CSV 文件csv.reader
- 在上面的代码中,我们导入 csv 模块,然后将 CSV 文件打开为state_file. 然后我们定义读取器对象并使用该csv.reader()函数将数据提取到对象中。然后我们遍历reader对象并检索我们数据的每一行。
- 使用写入 CSV 文件csv.writer
- 使用 DictWriter 写入 CSV 文件
发表评论