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

Python 的 CSV 模块指南

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

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]删除
最新教程 更多>
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-05-21
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-05-21
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-05-21
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-05-21
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-05-21
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-05-21
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-05-21
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-05-21
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-05-21
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-05-21
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-05-21
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-05-21
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-21
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-05-21
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-05-21

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

Copyright© 2022 湘ICP备2022001581号-3