Python 逐行读取 CSV 文件的完全指南:从入门到精通

在日常的数据处理任务中,我们经常需要与各种格式的数据打交道。其中,CSV(逗号分隔值)文件可以说是最常见、最通用的数据交换格式之一。无论你是做数据分析、后端开发,还是简单的脚本自动化,掌握如何在 Python 中高效、优雅地读取 CSV 文件都是一项必不可少的技能。

你可能已经遇到过这样的情况:手里有一份庞大的 Excel 导出的数据,或者是系统生成的日志报表,你需要用 Python 把它们读出来进行清洗、计算或迁移。虽然我们可以用字符串分割的方法来硬解,但这既不优雅也容易出错。在这篇文章中,我们将深入探讨如何使用 Python 内置的 INLINECODEfd1c6b1b 模块,特别是 INLINECODE717272ee 和 DictReader,来逐行读取 CSV 文件。我们不仅会看基础的语法,还会分享一些在实际开发中非常有用的技巧和最佳实践,帮助你写出更健壮的代码。

什么是 CSV 文件?

在开始写代码之前,让我们先明确一下我们在处理什么。CSV 代表 Comma-Separated Values(逗号分隔值)。正如其名,它是一种纯文本文件,使用逗号来区分不同的数据字段。这就好比是把一张表格“拍扁”成了文本形式。

  • 每一行代表一条记录(数据库中的一行)。

n* 每一列代表一个字段(比如“姓名”、“ID”)。

这种格式简单到甚至可以用记事本打开编辑,但也强大到被全球几乎所有的数据处理系统支持。让我们看一个直观的例子:

ID,Name,Role,Department
101,Alice,Engineer,Dev
102,Bob,Designer,UX
103,Charlie,Manager, Sales

在这个例子中,第一行通常是表头,定义了数据的结构。随后的每一行都是具体的数据。虽然逗号是标准分隔符,但在某些地区或系统中,你可能会看到分号或其他符号,不过 Python 的 csv 模块都能轻松应对。

准备工作:如何创建测试用的 CSV 文件

在正式读取之前,我们需要有一个文件可以操作。你可以通过两种简单的方式创建它:

1. 使用记事本

这是最朴素但也最通用的方式。打开记事本,输入你的数据,用逗号分隔。保存时,务必将文件名后缀设为 INLINECODE4af0eedc(例如 INLINECODE59f36571)。如果你的数据中包含中文,建议在保存时选择编码为 UTF-8,以防后续读取出现乱码。

2. 使用 Microsoft Excel

对于熟悉表格的用户,这是更方便的方法。在 Excel 单元格中像往常一样输入数据,然后点击“另存为”,在文件类型下拉菜单中选择 “CSV UTF-8(逗号分隔) (*.csv)”。这不仅能保证格式正确,还能处理好字符编码问题。

方法一:使用 csv.reader 进行逐行读取

INLINECODEd0998cff 是 Python 内置 INLINECODE36cfd4bf 模块中最基础的读取方式。它将 CSV 文件的每一行解析为一个字符串列表。这意味着,每一行数据在 Python 中看起来就像这样:[‘ID‘, ‘Name‘, ‘Role‘]

这种方式非常适合当你只需要按顺序遍历数据,或者对列的位置非常熟悉时使用。

#### 核心语法与步骤

使用 reader 主要分为三步:

  • 导入模块import csv
  • 打开文件:使用 open() 函数获取文件对象。
  • 创建 Reader 对象:将文件对象传递给 csv.reader()

语法结构:

reader_obj = csv.reader(fileobject)

这里有一个重要的细节:在打开文件时,强烈建议加上 newline=‘‘ 参数。这是为了防止在不同操作系统(如 Windows)上出现多余的空行。

#### 实战示例 1:读取全部内容

假设我们有一个名为 employees.csv 的文件,内容如下:

ID,Name,Department
101,李明,研发部
102,王强,市场部
103,张伟,设计部

我们的目标是用 Python 将这些内容打印出来。

# 导入 csv 模块
import csv

# 指定文件名
filename = ‘employees.csv‘

try:
    # 使用 ‘r‘ 模式读取,并显式指定编码为 utf-8 以支持中文
    # newline=‘‘ 是为了兼容不同平台的换行符处理
    with open(filename, mode=‘r‘, encoding=‘utf-8‘, newline=‘‘) as file_obj:
        
        # 创建 reader 对象
        reader_obj = csv.reader(file_obj)
        
        print(f"正在读取文件: {filename}")
        print("--- 输出内容 ---")
        
        # 遍历 reader 对象中的每一行
        for row in reader_obj:
            # row 是一个列表,例如 [‘101‘, ‘李明‘, ‘研发部‘]
            print(row)
            
except FileNotFoundError:
    print(f"错误:找不到文件 {filename},请检查路径是否正确。")

输出结果:

[‘ID‘, ‘Name‘, ‘Department‘]
[‘101‘, ‘李明‘, ‘研发部‘]
[‘102‘, ‘王强‘, ‘市场部‘]
[‘103‘, ‘张伟‘, ‘设计部‘]

#### 实战示例 2:跳过表头

在实际业务中,我们通常不需要处理第一行的标题行,因为那只是字段名。我们可以利用 Python 内置的 INLINECODE191c6ad1 函数来快速跳过它。INLINECODE6c5bd9bf 函数会从迭代器中获取并“消耗”掉第一项。

import csv

filename = ‘employees.csv‘

with open(filename, mode=‘r‘, encoding=‘utf-8‘, newline=‘‘) as file_obj:
    # 创建 reader 对象
    reader_obj = csv.reader(file_obj)
    
    # 使用 next() 跳过第一行(表头)
    # 这行代码读取了第一行但不做任何处理
    header = next(reader_obj)
    
    print("已跳过表头,开始读取数据行:")
    
    # 现在循环将从第二行开始
    for row in reader_obj:
        # 我们可以通过索引来访问特定的列
        # row[0] 是 ID, row[1] 是 Name
        print(f"员工 ID: {row[0]}, 姓名: {row[1]}")

输出结果:

已跳过表头,开始读取数据行:
员工 ID: 101, 姓名: 李明
员工 ID: 102, 姓名: 王强
员工 ID: 103, 姓名: 张伟

技巧点拨:如果你不知道具体有多少列,或者需要打印表头信息,可以把 INLINECODE13a90e10 返回的 INLINECODEd16b869e 变量保存下来,甚至可以将其与数据行结合使用,这在做简单的数据校验时非常有用。

方法二:使用 csv.DictReader 进行字典式读取

虽然 csv.reader 很简单,但它的一个主要缺点是:你必须记住每一列对应的索引数字(第0列是ID,第1列是名字…)。一旦 CSV 文件的列顺序发生了调整,你的代码就会出错,数据会张冠李戴。

为了解决这个问题,Python 提供了更强大的 csv.DictReader

DictReader 将每一行数据映射为一个字典(Dictionary)。字典的键就是 CSV 文件的表头,值就是对应单元格的内容。这样你就可以通过列名来访问数据,代码的可读性和健壮性都会大大提升。

#### 核心语法

reader_obj = csv.DictReader(fileobject)

#### 实战示例 3:使用列名访问数据

让我们用 DictReader 重写上面的例子。

import csv

filename = ‘employees.csv‘

with open(filename, mode=‘r‘, encoding=‘utf-8‘, newline=‘‘) as file_obj:
    # 创建 DictReader 对象
    # DictReader 会自动将第一行作为键
    reader_obj = csv.DictReader(file_obj)
    
    print("--- 使用 DictReader 读取 ---")
    
    for row in reader_obj:
        # 现在 row 是一个有序字典
        # 我们可以通过列名直接访问,无需关心索引
        print(f"部门: {row[‘Department‘]} - 员工: {row[‘Name‘]}")

输出结果:

--- 使用 DictReader 读取 ---
部门: 研发部 - 员工: 李明
部门: 市场部 - 员工: 王强
部门: 设计部 - 员工: 张伟

这看起来是不是舒服多了?即使你在 CSV 文件中把“Department”列移到了最前面,这段代码依然能正常工作,不需要修改任何索引。

#### 实战示例 4:处理没有表头的 CSV

有时候,我们遇到的 CSV 文件可能没有表头行。如果直接用 INLINECODE71281641,它会把第一行数据当成表头。这时,我们可以手动指定 INLINECODE1cfab2c9 参数。

假设 data.csv 内容如下:

101,李明,5000
102,王强,6000

代码实现:

import csv

filename = ‘data.csv‘

# 手动定义字段名
field_names = [‘ID‘, ‘Name‘, ‘Salary‘]

with open(filename, mode=‘r‘, encoding=‘utf-8‘, newline=‘‘) as file_obj:
    # 将 fieldnames 传递给 DictReader
    reader_obj = csv.DictReader(file_obj, fieldnames=field_names)
    
    for row in reader_obj:
        print(row)

输出结果:

{‘ID‘: ‘101‘, ‘Name‘: ‘李明‘, ‘Salary‘: ‘5000‘}
{‘ID‘: ‘102‘, ‘Name‘: ‘王强‘, ‘Salary‘: ‘6000‘}

进阶技巧:处理特殊情况与最佳实践

在实际工作中,CSV 文件往往不是完美的。你可能会遇到缺失的值、巨大的文件或者奇怪的编码。让我们来看看如何应对这些挑战。

#### 1. 处理缺失值与默认值

使用 DictReader 时,如果某个单元格是空的,对应的字典值也会是空的。我们可以在代码中进行判断。

import csv

filename = ‘employees_missing.csv‘

with open(filename, mode=‘r‘, encoding=‘utf-8‘, newline=‘‘) as file_obj:
    reader_obj = csv.DictReader(file_obj)
    
    for row in reader_obj:
        # 使用 get() 方法,并提供一个默认值
        # 如果 ‘Email‘ 列为空或不存在,将返回 ‘N/A‘
        email = row.get(‘Email‘, ‘N/A‘)
        name = row[‘Name‘]
        print(f"员工 {name} 的邮箱是: {email}")

#### 2. 编码问题(UnicodeDecodeError)

这是新手最常遇到的问题。当你运行代码报错 UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte... 时,说明文件不是 UTF-8 编码的。

解决方案:尝试使用 INLINECODE6b6d4149 (中文 Windows 常用) 或 INLINECODEfbf26f30 (通用) 编码打开文件。

# 尝试不同的编码
with open(filename, mode=‘r‘, encoding=‘gbk‘, newline=‘‘) as file_obj:
    # ...

#### 3. 处理包含逗号的字段

标准的 CSV 格式规定,如果字段内容本身包含逗号,必须用双引号括起来。例如:

ID,Description
1,"红色, 大号"

Python 的 INLINECODEeb6ca87e 模块非常智能,它会自动处理这种情况。它会将 INLINECODE8a6a449e 识别为一个整体,而不会将其拆分为两个部分。这也是为什么不建议手动用 split(‘,‘) 来解析 CSV 的原因——你很难手动处理好这些边缘情况。

总结与建议

在本文中,我们详细探讨了如何使用 Python 的 csv 模块来逐行读取数据。让我们回顾一下核心要点:

  • 使用 INLINECODE25bcb5cf 上下文管理器:始终使用 INLINECODE6e1ff365 语句,这能确保文件在操作完成后自动关闭,即使中间发生了错误也不会导致文件句柄泄露。

n2. 选择合适的工具

n * 如果你只需要快速遍历,且列的位置固定,使用 csv.reader,它更轻量。

n * 如果你需要根据列名访问数据,或者为了代码的长期维护性,请务必使用 csv.DictReader。这是生产环境中最推荐的做法。

n3. 注意编码:在处理中文环境下的文件时,明确指定 INLINECODE2e5a4029 通常是最稳妥的选择,遇到报错再尝试 INLINECODEb338fc73。

n4. 文件路径:如果文件路径中包含反斜杠(如 Windows 路径 INLINECODE67c831eb),建议在引号前加 INLINECODE151b68b9,例如 INLINECODE4cb21445,或者直接使用正斜杠 INLINECODEc0359824,以避免转义字符问题。

n

掌握了这些基础知识后,你可以尝试结合 Python 的 INLINECODE0681947c 库来进行更复杂的数据分析,或者将这些读取到的数据写入数据库。但请记住,对于简单的脚本任务,内置的 INLINECODE107c16aa 模块往往是性能最好且依赖最少的原生选择。希望这篇文章能帮助你更自信地处理日常的数据文件!

n

下一步建议:

n你可以尝试编写一个小脚本,读取一个包含“产品名称”和“价格”的 CSV 文件,计算所有产品的总价格,并将结果打印出来。这将是一个很好的练习机会。

n

# 尝试解答这个小挑战
import csv

total_price = 0.0
# 你的代码在这里...
print(f"总价格: {total_price}")
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/23757.html
点赞
0.00 平均评分 (0% 分数) - 0