”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Python 的 CSV 模块指南

Python 的 CSV 模块指南

发布于2024-11-08
浏览:727

Guide to Python

处理数据是编程中不可避免的一部分,作为一个经常发现自己深陷各种文件格式的人,我一直很欣赏 Python 如何简化整个过程。

CSV 文件是一种经常出现的文件格式,特别是在数据分析中。

CSV(即逗号分隔值)由于其简单性而成为一种流行的数据交换格式。

幸运的是,Python 附带了一个名为 csv 的内置模块,这使得处理这些文件变得非常高效。

在本文中,我将详细介绍 csv 模块在 Python 中的工作原理,从基本用法到更高级的技术,这些技术可以在处理数据时节省大量时间。


什么是 CSV 文件?

在深入研究 csv 模块之前,让我们首先对 CSV 文件是什么有一个基本的了解。

CSV 文件本质上是一个纯文本文件,其中每一行代表一行数据,每个值由逗号(或有时是制表符等其他分隔符)分隔。

这是一个简单的示例:

Name,Age,Occupation
Alice,30,Engineer
Bob,25,Data Scientist
Charlie,35,Teacher

为什么使用 csv 模块?

您可能想知道为什么需要 csv 模块,因为 CSV 文件只是理论上可以使用 Python 标准文件处理方法读取的文本文件。

虽然这是事实,但 CSV 文件可能具有复杂性,例如嵌入的逗号、单元格内的换行符以及不同的分隔符,这些复杂性很难手动处理。

csv 模块抽象了所有这些,让您专注于数据。


读取 CSV 文件

让我们进入代码。

对 CSV 文件执行的最常见操作是读取其内容。

模块中的 csv.reader() 函数是一个易于使用的工具。

这是有关如何执行此操作的分步指南。

基本 CSV 读取

import csv

# Open a CSV file
with open('example.csv', 'r') as file:
    reader = csv.reader(file)

    # Iterate over the rows
    for row in reader:
        print(row)

这是读取 CSV 文件的最简单方法。

csv.reader() 返回一个可迭代对象,其中每次迭代都会为您提供一个表示文件行的列表。

处理标头
大多数 CSV 文件的第一行都带有标题,例如列名称。

如果不需要这些标题,则可以在迭代时简单地跳过第一行:

import csv

with open('example.csv', 'r') as file:
    reader = csv.reader(file)

    # Skip header
    next(reader)

    for row in reader:
        print(row)

有时,我处理的文件包含有用和不相关的数据,我发现自己跳过的行不仅仅是基于标题。

您可以在 for 循环中轻松完成此操作。

DictReader:更直观的读取 CSV 文件的方式
如果您的 CSV 文件有标题,则 csv.DictReader() 是另一个很棒的选项,它将每一行作为字典读取,键是列名称:

import csv

with open('example.csv', 'r') as file:
    reader = csv.DictReader(file)

    for row in reader:
        print(row)

这种方法可以使您的代码更具可读性和直观性,特别是在处理大型数据集时。

例如,访问 row['Name'] 感觉比处理像 row[0].

这样基于索引的访问要清晰得多

写入 CSV 文件

读取并处理数据后,您可能会想要保存或导出它。

csv.writer() 函数是写入 CSV 文件的首选工具。

基本 CSV 编写

import csv

# Data to be written
data = [
    ['Name', 'Age', 'Occupation'],
    ['Alice', 30, 'Engineer'],
    ['Bob', 25, 'Data Scientist'],
    ['Charlie', 35, 'Teacher']
]

# Open a file in write mode
with open('output.csv', 'w', newline='') as file:
    writer = csv.writer(file)

    # Write data to the file
    writer.writerows(data)

writer.writerows() 函数获取一个列表列表并将它们写入 CSV 文件,其中每个内部列表代表一行数据。

DictWriter:编写 CSV 文件的更简洁方法
正如我们使用 DictReader 将 CSV 文件读入字典一样,我们也使用 DictWriter 将字典写入 CSV。

当您想要显式指定列名称时,此方法特别方便。

import csv

# Data as list of dictionaries
data = [
    {'Name': 'Alice', 'Age': 30, 'Occupation': 'Engineer'},
    {'Name': 'Bob', 'Age': 25, 'Occupation': 'Data Scientist'},
    {'Name': 'Charlie', 'Age': 35, 'Occupation': 'Teacher'}
]

# Open file for writing
with open('output.csv', 'w', newline='') as file:
    fieldnames = ['Name', 'Age', 'Occupation']
    writer = csv.DictWriter(file, fieldnames=fieldnames)

    # Write the header
    writer.writeheader()

    # Write the data
    writer.writerows(data)

使用 DictWriter,您可以获得一个漂亮、干净的界面来将字典写入 CSV,同时保持代码的可读性和简洁性。


自定义分隔符

默认情况下,CSV 模块使用逗号分隔值,但有时您可能正在处理使用其他分隔符(例如制表符或分号)的文件。

csv 模块通过指定分隔符参数提供了一种简单的方法来处理这些情况。

import csv

with open('example_tab.csv', 'r') as file:
    reader = csv.reader(file, delimiter='\t')

    for row in reader:
        print(row)

我遇到过使用分号而不是逗号的 CSV 文件(通常来自欧洲来源),令人欣慰的是,Python 的 csv 模块可以轻松处理此问题。

无论是逗号、制表符还是任何其他分隔符,csv 模块都能满足您的要求。


处理复杂数据

如果您的数据在字段、引号甚至换行符中包含逗号怎么办?

CSV 模块通过使用引用机制自动处理此类情况。

您还可以使用 quoting 参数控制引用的工作方式。

import csv

data = [
    ['Name', 'Occupation', 'Description'],
    ['Alice', 'Engineer', 'Works on, "cutting-edge" technology'],
    ['Bob', 'Data Scientist', 'Loves analyzing data.']
]

with open('complex.csv', 'w', newline='') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_ALL)
    writer.writerows(data)

在此示例中,QUOTE_ALL 确保每个字段都用引号引起来。

其他引用选项包括 csv.QUOTE_MINIMAL、csv.QUOTE_NONNUMERIC 和 csv.QUOTE_NONE,让您可以完全控制 CSV 数据的格式。


结论

多年来,我开始依赖 CSV 格式作为一种轻量级、高效的数据移动方式,而 Python 的 csv 模块一直是这段旅程中值得信赖的伴侣。

无论您是处理简单的电子表格还是复杂的多行数据字段,该模块都使该过程变得直观且轻松。

虽然使用 CSV 乍一看似乎是一项平凡的任务,但它是掌握数据操作的门户。

根据我的经验,一旦您掌握了 CSV,您就会发现自己可以自信地处理更大、更复杂的格式,例如 JSON 或 SQL 数据库。毕竟,一切都是从基础开始的。

版本声明 本文转载于:https://dev.to/devasservice/guide-to-pythons-csv-module-32ie?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3