Python 操作 CSV
运用过 CSV 文件都知道:假如咱们的电脑中装了 WPS 或 Microsoft Office 的话,.csv文件默认是被 Excel 翻开的,那么什么是 CSV 文件?CSV 文件与 Excel 文件有什么区别?如何经过 Python 来操作 CSV 文件呢?带着这些问题咱们接着往下看。
1 简介
1.1 CSV
CSV 全称 Comma-Separated Values,中文叫逗号分隔值或字符分隔值,它以纯文本形式存储表格数据(数字和文本),其本质便是一个字符序列,能够由恣意数目的记载组成,记载之间以某种换行符分隔,每条记载由字段组成,一般一切记载具有完全相同的字段序列,字段间常用逗号或制表符进行分隔。CSV 文件格局简略、通用,在实际中有着广泛的运用,其间运用最多的是在程序之间搬运表格数据。
1.2 CSV 与 Excel
由于 CSV 文件与 Excel 文件默认都是用 Excel 东西翻开,那他们有什么区别呢?咱们经过下表简略了解一下。
CSV | Excel |
文件后缀为.csv | 文件后缀为.xls或.xlsx |
纯文本文件 | 二进制文件 |
存储数据不包括格局、公式等 | 不只能够存储数据,还能够对数据进行操作 |
能够经过 Excel 东西翻开,也能够经过文本编辑器翻开 | 只能经过 Excel 东西翻开 |
只能编写一次列标题 | 每一行中的每一列都有一个开始符号和完毕符号 |
导入数据时耗费内存较少 | 导入数据时耗费内存较多 |
2 根本运用
Python 经过 csv 模块来实现 CSV 格局文件中数据的读写,该模块供给了兼容 Excel 方式输出、读取数据文件的功用,这样咱们无需知道 Excel 所选用 CSV 格局的细节,相同的它还能够界说其他运用程序可用的或特定需求的 CSV 格局。
csv 模块中运用 reader 类和 writer 类读写序列化的数据,运用 DictReader 类和 DictWriter 类以字典的形式读写数据,下面来具体看一下相应功用。首先来看一下 csv 模块常量信息,如下所示:
特点 | 阐明 |
QUOTE_ALL | 指示 writer 目标给一切字段加上引号 |
QUOTE_MINIMAL | 指示 writer 目标仅为包括特别字符(如:定界符、引号字符、行完毕符等)的字段加上引号 |
QUOTE_NONNUMERIC | 指示 writer 目标为一切非数字字段加上引号 |
QUOTE_NONE | 指示 writer 目标不运用引号引出字段 |
writer(csvfile, dialect='excel', **fmtparams)
回来一个 writer 目标,该目标负责将用户的数据在给定的文件类目标上转换为带分隔符的字符串。csvfile 能够是具有 write() 办法的任何目标,假如 csvfile 是文件目标,则运用 newline='' 翻开;可选参数 dialect 是用于不同的 CSV 变种的特定参数组;可选关键字参数 fmtparams 能够覆写当前变种格局中的单个格局设置。看下示例:
import csv with open('test.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(['id', 'name', 'age']) writer.writerow(['1001', '张三', '222']) # 写入多行 # data = [('1001', '张三', '21'), ('1002', '李四', '31')] # writer.writerows(data)
咱们翻开文件看一下结果,如图所示:
reader(csvfile, dialect='excel', **fmtparams)
回来一个 reader 目标,该目标将逐行遍历 csvfile,csvfile 能够是文件目标和列表目标,假如是文件目标要运用 newline='' 翻开。看下示例:
>>> import csv >>> with open('test.csv', newline='') as csvfile:>>> reader = csv.reader(csvfile, delimiter=' ')>>> for row in reader:>>> print(', '.join(row))id,name,age1001,张三,222
register_dialect(name[, dialect[, **fmtparams]])
将 name 与 dialect 相关起来。name 有必要是字符串,要指定 dialect,能够给出 Dialect 的子类或给出 fmtparams 关键字参数,也能够两者都给出(此时关键字参数会覆盖 dialect 参数)。先来看一下 dialect 和 fmtparams 具体信息,如下所示:
特点 | 阐明 |
delimiter | 用于分隔字段的单字符,默以为逗号 |
doublequote | 操控出现在字段中的引号字符自身应如何被引出,值为 True,双写引号字符,值为 False,则在引号字符的前面放置转义符,默认值为 True |
quoting | 操控 writer 何时生成引号,以及 reader 何时识别引号 |
lineterminator | 放在 writer 产生的行的结尾,默以为 '\r\n' |
quotechar | 一个单字符,用于包住含有特别字符(如:引号字符、换行符等)的字段,默以为 '"' |
skipinitialspace | 值为 True,疏忽定界符之后的空格,默以为 False |
strict | 值为 True,则在输入过错的 CSV 时抛出 Error 反常,默认值为 False |
escapechar | 用于 writer 的单字符,在 quoting 设置为 QUOTE_NONE 的情况下转义定界符,在 doublequote 设置为 False 的情况下转义引号字符,默以为 None,表示禁用转义 |
下面经过一个示例作进一步了解,如下所示:
>>> import csv >>> csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_ALL)>>> with open('test.csv', 'w', newline='') as csvfile:>>> writer = csv.writer(csvfile, 'mydialect')>>> writer.writerow(['id', 'name', 'age'])>>> writer.writerow(['1001', '张三', '222'])>>> with open('test.csv', newline='') as csvfile:>>> reader = csv.reader(csvfile, delimiter=' ')>>> for row in reader:>>> print(', '.join(row))id|"name"|"age"1001|"张三"|"222"
DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
创立一个目标,该目标在操作上类似惯例 writer,但会将字典映射到输出行,fieldnames 参数是由键组成的序列,它指定字典中值的次序,这些值会按指定次序传递给 writerow() 办法并写入文件;假如字典缺少 fieldnames 中的键,则可选参数 restval 用于指定要写入的值;假如传递给 writerow() 办法的字典的某些键在 fieldnames 中找不到,则可选参数 extrasaction 用于指定要执行的操作,假如将其设置为默认值 'raise',则会引发 ValueError, 假如将其设置为 'ignore',则字典中的其他键值将被疏忽;一切其他可选或关键字参数都传递给底层的 writer 实例。看下示例:
>>> import csv >>> with open('test.csv', 'w', newline='') as csvfile:>>> fieldnames = ['id', 'name', 'age']>>> writer = csv.DictWriter(csvfile, fieldnames=fieldnames)>>> writer.writeheader()>>> writer.writerow({'id': '1001', 'name': '张三', 'age': '21'})>>> writer.writerow({'id': '1002', 'name': '李四', 'age': '31'})>>> with open('test.csv', newline='') as csvfile:>>> reader = csv.reader(csvfile, delimiter=' ')>>> for row in reader:>>> print(', '.join(row))id,name,age1001,张三,211002,李四,31
DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
创立一个目标,该目标在操作上类似于惯例 reader,可是将每行中的信息映射到一个 dict,该 dict 的键由 fieldnames(是一个序列)可选参数给出,假如省掉 fieldnames,则文件榜首行中的值将用作字段名;假如某一行中的字段多于字段名,则其他字段将放入列表中,字段名由 restkey 指定(默以为 None),假如非空白行的字段少于字段名,则缺少的值将用 None 填充。看一下示例:
>>> import csv >>> with open('test.csv', newline='') as csvfile:>>> reader = csv.DictReader(csvfile)>>> for row in reader:>>> print(row['id'], row['name'], row['age'])1001 张三 211002 李四 31
Sniffer 类
用于揣度 CSV 文件的格局,该类供给了如下两个办法:
sniff(sample, delimiters=None)
分析给定的 sample,假如给出可选的 delimiters 参数,则该参数会被解释为字符串,该字符串包括了或许的有用定界符。
has_header(sample)
分析示例文本(假定为 CSV 格局),假如榜首行很或许是一系列列标题,则回来 True。
该类及办法运用较少,了解即可,下面经过一个示例简略了解一下。
import csv with open('test.csv', newline='') as csvfile: dialect = csv.Sniffer().sniff(csvfile.read(1024)) csvfile.seek(0) reader = csv.reader(csvfile, dialect) for row in reader: print(row)
Reader 目标
Reader 目标指 DictReader 实例和 reader() 函数回来的目标,下面看一下其揭露特点和办法。
__next__()
回来 reader 的可迭代目标的下一行,回来值或许是列表或字典。
dialect
dialect 描绘,只读,供解析器运用。
line_num
源迭代器已经读取了的行数。
fieldnames
字段名称,该特点为 DictReader 目标特点。
Writer 目标
Writer 目标指 DictWriter 实例和 writer() 函数回来的目标,下面看一下其揭露特点和办法。
writerow(row)
将参数 row 写入 writer 的文件目标。
writerows(rows)
将 rows*(即能迭代出多个上述 *row 目标的迭代器)中的一切元素写入 writer 的文件目标。
writeheader()
在 writer 的文件目标中,写入一行字段名称,该办法为 DictWriter 目标办法。
dialect
dialect 描绘,只读,供 writer 运用。
总结
本文介绍了 CSV 及运用 Python 操作 CSV 文件,能够经过本文的学习对 CSV 有一定了解及经过 Python 实际操作 CSV 文件。
我有话说: