Python中CSV文件处理全攻略
目录
- 一、CSV 格式简介
- 二、csv模块核心内容
- (一)模块函数
- (二)模块类
- (三)模块常量
- (四)模块异常
- 三、变种与格式参数
- 四、Reader 对象与 Writer 对象
- (一)Reader 对象
- (二)Writer 对象
- 五、实际应用示例
- (一)基本读写操作
- (二)处理特殊格式文件
- (三)注册自定义变种
- (四)处理字符串数据
- 总结
一、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.devze.com字符串写入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'])
csv.Dialect
:是一个容器类,通过其属性定义 CSV 文件的格式处理方式,如双引号、空白符、分隔符等的处理规则。不同的Dialect
子类对应不同的 CSV 文件格式变种,例如csv.excel
定义了 Excel 生成的 CSV 文件的常规属性,csv.excel_tab
对应 Excel 生成的制表符分隔的 CSV 文件,csv.Unix_dialect
适用于 UNIX 系统生成的 CSV 文件(以'\n'
为换行符,所有字段用引号包围) 。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
模块定义了多个常量,用于控制writer
和reader
对象的引号处理行为。如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_NOTNULL
和QUOTE_STRINGS
对reader
对象的行为存在 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 | 用于转义定界符(quoting 为QUOTE_NONE 时)或引号字符(doublequote 为False 时)的单字符 | None (禁用转义) |
lineterminator | writer 产生的行的结尾字符 | '\r\n' |
quotechar | 用于包住含有特殊字符字段的单字符 | '"' |
quoting | 控制writer 生成引号和reader 识别引号的时机,可设为QUOTE_* 常量 | QUOTE_MINIMAL |
skipinitialspace | 是否忽略紧跟在分隔符后的空格 | False |
strict | 输入错误的 CSV 时是否抛出Error 异常 | False |
在创建reader
或writer
对象时,可以指定dialect
参数(字符串或Dialect
子类实例),也可以单独指定格式参数来覆盖dialect
中的默认设置。
四、Reader 对象与 Writer 对象
(一)Reader 对象
Reader
对象(包括DictReader
实例和reader()
函数返回的对象)用于读取 CSV 数据。它具有以下方法和属性:
- 方法:
__next__()
方法返回可迭代对象的下一行数据,根据当前Dialect
解析,可通过next(reader)
调用。 - 属性:
dialect
属性为只读,用于获取当前解析使用的变种描述;line_num
属性记录源迭代器已读取的行数,与返回的记录数可能不同,因为记录可能跨越多行。DictReader
对象还有fieldnames
属性,用于获取字段名称,若创建对象时未传入,则在首次访问或读取第一条记录时初始化。
(二)Writer 对象
Writer
对象(包括DictWriter
实例和writer()
函数返回的对象)负责将数据写入 CSV 文件。其方法和属性如下:
- 方法:
writeroandroidw(row)
方法将row
写入文件对象,按当前Dialect
格式化,返回底层文件对象write
方法的返回值;writerows(rows)
方法将rows
中的所有元素写入文件对象。DictWriter
对象的writeheader()
方法用于写入一行字段名称(构造函数中指定),返回csvwriter.writerow()
方法的返回值。 - 属性:
dialect
属性为只读,供writer
使用,用于获取当前写入使用的变种描述。
五、实际应用示例
(一)基本读写操作
- 读取 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.devze.com:
import csv for row in csv.reader(['one,two,three']): print(row)
总结
Python 的csv模块为 CSV 文件处理提供了全面且灵活的工具。通过掌握csv模块的函数、类、常量以及变种与格式参数的设置,开发者能够高效地读取、写入和处理各种格式的 CSV 文件。在实际应用中,要根据 CSV 文件的具体格式特点选择合适的方法和参数,同时注意处理可能出现的错误情况,确保数据处理的准确性和稳定性。
以上就是Python中CSV文件处理全攻略的详细内容,更多关于Python CSV文件处理的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论