Python中CSV文件处理全攻略

2025-05-19 02:50
文章标签 python 处理 csv 全攻略

本文主要是介绍Python中CSV文件处理全攻略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python中CSV文件处理全攻略》在数据处理和存储领域,CSV格式凭借其简单高效的特性,成为了电子表格和数据库中常用的文件格式,Python的csv模块为操作CSV文件提供了强大的支持,本文将深入...

一、CSV 格式简介

CSV 格式是一种以纯文本形式存储表格数据的文件格式,用特定分隔符(通常是逗号)隔开不同字段。例如,一条包含姓名、年龄和城市的记录,在 CSV 文件中可能表示为"Alice,25,New York"。虽然 CSV 格式被广泛应用,但由于缺乏统一标准,不同应用程序生成的 CSV 文件在格式细节上可能存在差异,这给数据处理带来了挑战。不过,其大致结构相似,使得编写通用处理模块成为可能。

二、csv模块核心内容

(一)模块函数

  • csv.reader(csvfile, dialect='excel', \**fmtparams):该函数用于创建一个reader对象,从给定的csvfile中读取数据。csvfile可以是文件对象或包含字符串的可迭代对象,打开文件时需设置newline=''dialect参数指定 CSV 变种,默认为'excel',也可通过list_dialects()函数获取已注册变种名称或自定义Dialect子类实例来设置。fmtparams用于覆盖当前变种的单个格式参数。例如:
import csv
with open('eggs.csv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
    for row in spamreader:
        print(', '.join(row))
  • csv.writer(csvfile, dialect='excel', \**fmtparams):返回一个writer对象,将数据转换为带分隔符的http://www.chinasem.cn字符串写入csvfile。csvfile需具有write()方法,打开文件时同样要设置newline=''。dialect和fmtparams作用与reader函数类似。示例如下:
import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
  • 其他函数:csv.register_dialect(name, [dialect, **fmtparams])用于注册自定义 CSV 变种;csv.unregister_dialect(name)删除已注册变种;csv.get_dialect(name)获取指定变种;csv.list_dialects()返回所有已注册变种名称;csv.field_size_limit([new_ljavascriptimit])获取或设置解析器允许的最大字段大小。

(二)模块类

  • csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', \*args, \**kwds):创建的对象类似常规reader,但将每行数据映射为字典,键由fieldnames指定。若fieldnames未提供,则文件第一行数据用作字段名并从结果中去除;若提供了,则第一行数据包含在结果中。多余字段数据会存储在以restkey为键的列表中(默认为None),缺失字段用restval填充(默认为None)。例如:
import csv
with open('names.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row['first_name'], row['last_name'])
  1. csv.Dialect:是一个容器类,通过其属性定义 CSV 文件的格式处理方式,如双引号、空白符、分隔符等的处理规则。不同的Dialect子类对应不同的 CSV 文件格式变种,例如csv.excel定义了 Excel 生成的 CSV 文件的常规属性,csv.excel_tab对应 Excel 生成的制表符分隔的 CSV 文件,csv.Unix_dialect适用于 UNIX 系统生成的 CSV 文件(以'\n'为换行符,所有字段用引号包围) 。
  2. csv.Sniffer:用于推断 CSV 文件的格式。sniff(sample, delimiters=None)方法分析给定样本数据,返回包含格式参数的Dialect子类;has_header(sample)方法判断样本数据首行是否为列标题,但这是一个粗略的启发式方法,可能出现误判。使用示例:
with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # 处理CSV文件内容

(三)模块常量

csv模块定义了多个常量,用于控制writerreader对象的引号处理行为。如csv.QUOTE_ALL指示writer给所有字段加引号;csv.QUOTE_MINIMAL仅为包含特殊字符的字段加引号;csv.QUOTE_NONNUMERIC为非数字字段加引号,并让reader将未加引号的字段转换为float类型;csv.QUOTE_NONE不使用引号引出字段,输出数据中定界符前需加转义符;csv.QUOTE_NOTNULL为不为None的字段加引号;csv.QUOTE_STRINGS总是为字符串字段加引号 。需要注意的是,在 python 3.12 中,QUOTE_NOTNULLQUOTE_STRINGSreader对象的行为存在 bug,该问题在 Python 3.13 中得到修复。

(四)模块异常

csv.Error异常由csv模块中发生错误的函数抛出,在编写代码处理 CSV 文件时,可通过捕获该异常来处理可能出现的错误,如文件格式错误、字段解析错误等。例如:

import csv, sys
filename ='some.csv'
with open(filename, newline='') as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            print(row)
    except csv.Error as e:
        sys.exit(f'file {filename}, line {reader.line_num}: {e}')

三、变种与格式参数

不同的 CSV 文件可能在分隔符、引号处理、行终止符等格式上存在差异,csv模块通过Dialect类的子类和格式参数来应对这些差异。Dialect类支持以下属性:

属性名描述默认值
delimiter字段分隔符,单字符','
doublequote控制字段中引号字符的引出方式,True表示双写引号字符,False表示在引号字符前加转义符True
escapechar用于转义定界符(quotingQUOTE_NONE时)或引号字符(doublequoteFalse时)的单字符None(禁用转义)
lineterminatorwriter产生的行的结尾字符'\r\n'
quotechar用于包住含有特殊字符字段的单字符'"'
quoting控制writer生成引号和reader识别引号的时机,可设为QUOTE_*常量QUOTE_MINIMAL
skipinitialspace是否忽略紧跟在分隔符后的空格False
strict输入错误的 CSV 时是否抛出Error异常False

在创建readerwriter对象时,可以指定dialect参数(字符串或Dialect子类实例),也可以单独指定格式参数来覆盖dialect中的默认设置。

四、Reader 对象与 Writer 对象

(一)Reader 对象

Reader对象(包括DictReader实例和reader()函数返回的对象)用于读取 CSV 数据。它具有以下方法和属性:

  1. 方法__next__()方法返回可迭代对象的下一行数据,根据当前Dialect解析,可通过next(reader)调用。
  2. 属性dialect属性为只读,用于获取当前解析使用的变种描述;line_num属性记录源迭代器已读取的行数,与返回的记录数可能不同,因为记录可能跨越多行。DictReader对象还有fieldnames属性,用于获取字段名称,若创建对象时未传入,则在首次访问或读取第一条记录时初始化。

(二)Writer 对象

Writer对象(包括DictWriter实例和writer()函数返回的对象)负责将数据写入 CSV 文件。其方法和属性如下:

  1. 方法writeroandroidw(row)方法将row写入文件对象,按当前Dialect格式化,返回底层文件对象write方法的返回值;writerows(rows)方法将rows中的所有元素写入文件对象。DictWriter对象的writeheader()方法用于写入一行字段名称(构造函数中指定),返回csvwriter.writerow()方法的返回值。
  2. 属性dialect属性为只读,供writer使用,用于获取当前写入使用的变种描述。

五、实际应用示例

(一)基本读写操作

  1. 读取 CSV 文件:使用csv.reader读取文件,逐行打印数据。
import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
  • 写入 CSV 文件:利用csv.writer将数据写入文件。
import csv
with open('some.csv', 'w', newline='') as f:
  xWkcbS  writer = csv.writer(f)
    writer.writerows([['data1', 'data2'], ['data3', 'data4']])

(二)处理特殊格式文件

处理非标准 CSV 格式文件时,需根据文件格式特点设置相应的参数。例如,处理以冒号为分隔符且不使用引号的文件:

import csv
with open('passwd', newline='') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)

(三)注册自定义变种

若项目中频繁使用特定格式的 CSV 文件,可注册自定义变种。例如:

import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
    reader = csv.reader(f, 'unixpwd')

(四)处理字符串数据

虽然csv模块不直接支持解析字符串,但可以通过将字符串包装成可迭代对象来处理。例如http://www.chinasem.cn

import csv
for row in csv.reader(['one,two,three']):
    print(row)

总结

Python 的csv模块为 CSV 文件处理提供了全面且灵活的工具。通过掌握csv模块的函数、类、常量以及变种与格式参数的设置,开发者能够高效地读取、写入和处理各种格式的 CSV 文件。在实际应用中,要根据 CSV 文件的具体格式特点选择合适的方法和参数,同时注意处理可能出现的错误情况,确保数据处理的准确性和稳定性。

以上就是Python中CSV文件处理全攻略的详细内容,更多关于Python CSV文件处理的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Python中CSV文件处理全攻略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154663

相关文章

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho