摘要:在本教程中,你将学习如何使用 Python 内置的 csv 模块读取 CSV 文件。
什么是 CSV 文件
CSV 代表逗号分隔值(comma-separated values)。CSV 文件是一种使用逗号分隔值的定界文本文件。
CSV 文件由一行或多行组成。每一行是一条数据记录,而每条数据记录由一个或多个用逗号分隔的值组成。此外,CSV 文件的所有行都包含相同数量的值。
通常,你会使用 CSV 文件以纯文本格式存储表格数据。CSV 文件格式非常流行,并且受到许多软件应用程序(如 Microsoft Excel 和 Google 表格)的支持。
在 Python 中读取 CSV 文件
要在 Python 中读取 CSV 文件,请按照以下步骤操作:
首先,导入 csv 模块:
import csv
第二,使用内置的 open()
函数以读取模式打开 CSV 文件:
f = open('path/to/csv_file')
如果 CSV 文件包含 UTF8 字符,你需要像这样指定编码:
f = open('path/to/csv_file', encoding='UTF8')
第三,将文件对象(f
)传递给 csv 模块的 reader()
函数。reader()
函数返回一个 csv 阅读器对象:
csv_reader = csv.reader(f)
csv_reader
是来自 CSV 文件的行的可迭代对象。因此,你可以使用 for 循环来迭代 CSV 文件的行:
for line in csv_reader:
print(line)
每一行都是一个值的列表。要访问每个值,你可以使用方括号表示法 []
。第一个值的索引为 0。第二个值的索引为 1,依此类推。
例如,以下代码访问某一行的第一个值:
line[0]
最后,一旦你不再访问该文件,务必通过调用文件对象的 close()
方法来关闭文件:
f.close()
使用 with
语句会更方便,这样你就不需要显式调用 close()
方法了。
以下示例说明了读取 CSV 文件的所有步骤:
import csv
with open('path/to/csv_file', 'r') as f:
csv_reader = csv.reader(f)
for line in csv_reader:
# process each line
print(line)
读取 CSV 文件示例
我们将使用 country.csv
文件,该文件包含国家信息,包括名称、面积、2 位字母国家代码、3 位字母国家代码:
下载country.csv文件。
以下展示了如何读取 country.csv
文件并将每一行显示到屏幕上:
import csv
with open('country.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
for line in csv_reader:
print(line)
输出:
['name', 'area', 'country_code2', 'country_code3']
['Afghanistan', '652090.00', 'AF', 'AFG']
['Albania', '28748.00', 'AL', 'ALB']
['Algeria', '2381741.00', 'DZ', 'DZA']
['American Samoa', '199.00', 'AS', 'ASM']
...
country.csv
文件的第一行是表头。为了区分表头和数据,你可以使用 enumerate()
函数来获取每一行的索引:
import csv
with open('country.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
for line_no, line in enumerate(csv_reader, 1):
if line_no == 1:
print('Header:')
print(line) # header
print('Data:')
else:
print(line) # data
在这个示例中,我们使用 enumerate()
函数并将第一行的索引指定为 1。
在循环内部,如果 line_no
是 1,则该行是表头。否则,它就是数据行。
另一种跳过表头的方法是使用 next()
函数next()
函数将阅读器推进到下一行。例如:
import csv
with open('country.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
# skip the first row
next(csv_reader)
# show the data
for line in csv_reader:
print(line)
以下代码读取 country.csv
文件并计算所有国家的总面积:
import csv
total_area = 0
# calculate the total area of all countries
with open('country.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
# skip the header
next(csv_reader)
# calculate total
for line in csv_reader:
total_area += float(line[1])
print(total_area)
输出:
148956306.9
使用 DictReader
类读取 CSV 文件
当你使用 csv.reader()
函数时,你可以使用方括号表示法(如 line[0]line[1]
等)来访问 CSV 文件中的值。然而,使用 csv.reader()
函数有两个主要限制:
第一,从 CSV 文件中访问值的方式不够直观。例如
line[0]
隐式地表示国家名称。如果你能像line['country_name']
这样访问国家名称,那将更具表现力。第二,当 CSV 文件中的列顺序发生变化或添加了新列时,你需要修改代码以获取正确的数据。
这时
DictReader
类就派上用场了DictReader
类也来自csv
模块。
DictReader
类允许你创建一个类似常规 CSV 阅读器的对象。但它将每一行的信息映射到一个字典(dict)中,该字典的键由第一行的值指定。
通过使用 DictReader
类,你可以像 line['name']
,line['area']
,line['country_code2']
和 line['country_code3']
,这样访问 country.csv
文件中的值。
以下示例使用 DictReader
类读取 country.csv
文件:
import csv
with open('country.csv', encoding="utf8") as f:
csv_reader = csv.DictReader(f)
# skip the header
next(csv_reader)
# show the data
for line in csv_reader:
print(f"The area of {line['name']} is {line['area']} km2")
输出:
The area of Afghanistan is 652090.00 km2
The area of Albania is 28748.00 km2
The area of Algeria is 2381741.00 km2
...
如果你想要使用与第一行指定的不同的字段名称,可以通过将字段名称的列表显式传递给 DictReader()
构造函数来指定它们,如下所示:
import csv
fieldnames = ['country_name', 'area', 'code2', 'code3']
with open('country.csv', encoding="utf8") as f:
csv_reader = csv.DictReader(f, fieldnames)
next(csv_reader)
for line in csv_reader:
print(f"The area of {line['country_name']} is {line['area']} km2")
在这个示例中,我们没有使用第一行的值作为字段名称,而是显式地将一个字段名称列表传递给了 DictReader
构造函数。
总结
使用
csv.reader()
函数或csv.DictReader
类来读取 CSV 文件中的数据。