MEMOO
MEMOO
Published on 2025-04-21 / 4 Visits
0
0

Python读取CSV文件

摘要:在本教程中,你将学习如何使用 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 文件中的数据。



Comment