CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。

csv 模块实现了 CSV 格式表单数据的读写。其提供了诸如“以兼容 Excel 的方式输出数据文件”或“读取 Excel 程序输出的数据文件”的功能,程序员无需知道 Excel 所采用 CSV 格式的细节。

csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。


csv 模块定义了以下函数:

csv.reader(csvfiledialect='excel'**fmtparams)

返回一个 reader 对象,该对象将逐行遍历 csvfile

如果 csvfile 是文件对象,则打开它时应使用 newline=''

可选参数 dialect 是用于不同的 CSV 变种的特定参数组。它可以是 Dialect 类的子类的实例,也可以是 list_dialects() 函数返回的字符串之一。

另一个可选关键字参数 fmtparams 可以覆写当前变种格式中的单个格式设置。请参见 变种与格式参数 部分。

import csvfile = open('csvDemo.csv', newline='')
csvReader = csv.reader(file, delimiter=' ', quotechar='|')
for row in csvReader:for ceil in row:print(ceil)
file.close()# output: A1,B1,C1,D1,E1
# output: A2,B2,C2,D2,E2
# output: A3,B3,C3,D3,E3

csv.writer(csvfiledialect='excel'**fmtparams)

返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。

如果 csvfile 是一个文件对象,则打开它时应使用 newline=''

import csvfile = open('csvDemo.csv', 'a', newline='')
csvWriter = csv.writer(file, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)row = ['A4', 'B4', 'C4', 'D4', 'E4']
csvWriter.writerow(row)rows = [['A5', 'B5', 'C5', 'D5', 'E5'], ['A6', 'B6', 'C6', 'D6', 'E6']]
csvWriter.writerows(rows)file.close()

csv.register_dialect(name[, dialect[, **fmtparams]])

将 dialect 与 name 关联起来。 name 必须是字符串。

import csvcsv.register_dialect('mySet', delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
file = open('csvDemo.csv', 'a', newline='')
csvWriter = csv.writer(file, 'mySet')row = ['A4', 'B4', 'C4', 'D4', 'E4']
csvWriter.writerow(row)rows = [['A5', 'B5', 'C5', 'D5', 'E5'], ['A6', 'B6', 'C6', 'D6', 'E6']]
csvWriter.writerows(rows)file.close()

csv.unregister_dialect(name)

从变种注册表中删除 name 对应的变种。如果 name 不是已注册的变种名称,则抛出 Error 异常。

import csvcsv.register_dialect('mySet', delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
file = open('csvDemo.csv', 'a', newline='')
csvWriter = csv.writer(file, 'mySet')row = ['A4', 'B4', 'C4', 'D4', 'E4']
csvWriter.writerow(row)rows = [['A5', 'B5', 'C5', 'D5', 'E5'], ['A6', 'B6', 'C6', 'D6', 'E6']]
csvWriter.writerows(rows)csv.unregister_dialect('mySet')
file.close()

csv.get_dialect(name)

返回 name 对应的变种。如果 name 不是已注册的变种名称,则抛出 Error 异常。该函数返回的是不可变的 Dialect 对象。

import csvcsv.register_dialect('mySet', delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)myDialect=csv.get_dialect('mySet')
print(myDialect.delimiter)
print(myDialect.quotechar)
print(myDialect.quoting)csv.unregister_dialect('mySet')# output: ,
# output: |
# output: 0

csv.list_dialects()

返回所有已注册变种的名称。

import csvcsv.register_dialect('mySet', delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
print(csv.list_dialects())
csv.unregister_dialect('mySet')# output: ['excel', 'excel-tab', 'unix', 'mySet']

csv.field_size_limit([new_limit])

返回解析器当前允许的最大字段大小。如果指定了 new_limit,则它将成为新的最大字段大小。

import csvprint(csv.field_size_limit())
# output: 131072csv.field_size_limit(1024)
print(csv.field_size_limit())
# output: 1024

csv 模块定义了以下类:

class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
创建一个对象,该对象在操作上类似于常规 reader,但是将每行中的信息映射到一个 dict,该 dict 的键由 fieldnames 可选参数给出。

fieldnames 参数是一个 sequence。如果省略 fieldnames,则文件 f 第一行中的值将用作字段名。无论字段名是如何确定的,字典都将保留其原始顺序。

如果某一行中的字段多于字段名,则剩余数据会被放入一个列表,并与 restkey 所指定的字段名 (默认为 None) 一起保存。 如果某个非空白行的字段少于字段名,则缺失的值会使用 restval 的值来填充 (默认为 None)。

所有其他可选或关键字参数都传递给底层的 reader 实例。

import csvfile = open('csvDemo.csv', newline='')
csvReader = csv.DictReader(file, delimiter=' ', quotechar='|')
for row in csvReader:for title in row:print(row[title])    # 第一行作为标题
file.close()# output: A2,B2,C2,D2,E2
# output: A3,B3,C3,D3,E3

class csv.DictWriter(ffieldnamesrestval=''extrasaction='raise'dialect='excel'*args**kwds)

创建一个对象,该对象在操作上类似常规 writer,但会将字典映射到输出行。 fieldnames 参数是由键组成的 序列,它指定字典中值的顺序,这些值会按指定顺序传递给 writerow() 方法并写入文件 f。 如果字典缺少 fieldnames 中的键,则可选参数 restval 用于指定要写入的值。 如果传递给 writerow() 方法的字典的某些键在 fieldnames 中找不到,则可选参数 extrasaction 用于指定要执行的操作。 如果将其设置为默认值 'raise',则会引发 ValueError。 如果将其设置为 'ignore',则字典中的其他键值将被忽略。 所有其他可选或关键字参数都传递给底层的 writer 实例。

import csv
from typing import Mappingfile = open('csvDemo.csv', 'a', newline='')
fieldnames = ['A1', 'B2', 'C3', 'D3', 'E3']
csvWriter = csv.DictWriter(file, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, fieldnames=fieldnames)
csvWriter.writeheader()# dict1 = dict()
# row = ['A4', 'B4', 'C4', 'D4', 'E4']
# for i in range(len(fieldnames)):
#     dict1[fieldnames[i]] = row[i]
# csvWriter.writerow(dict1)row = ['A4', 'B4', 'C4', 'D4', 'E4']
dict1 = dict(zip(fieldnames,row))
csvWriter.writerow(dict1)rows = [['A5', 'B5', 'C5', 'D5', 'E5'], ['A6', 'B6', 'C6', 'D6', 'E6']]
list1 = []
for i in range(len(rows)):dict2 = dict(zip(fieldnames, rows[i]))list1.append(dict2)
csvWriter.writerows(list1)file.close()

class csv.Dialect
Dialect 类是一个容器类,其属性包含有如何处理双引号、空白符、分隔符等的信息。 由于缺少严格的 CSV 规格描述,不同的应用程序会产生略有差别的 CSV 数据。 Dialect 实例定义了 reader 和 writer 实例将具有怎样的行为。

所有可用的 Dialect 名称会由 list_dialects() 返回,并且它们可由特定的 reader 和 writer 类通过它们的初始化函数 (__init__) 来注册

class csv.excel
excel 类定义了 Excel 生成的 CSV 文件的常规属性。它在变种注册表中的名称是 'excel'。

class csv.excel_tab
excel_tab 类定义了 Excel 生成的、制表符分隔的 CSV 文件的常规属性。它在变种注册表中的名称是 'excel-tab'。

class csv.unix_dialect
unix_dialect 类定义了在 UNIX 系统上生成的 CSV 文件的常规属性,即使用 '\n' 作为换行符,且所有字段都有引号包围。它在变种注册表中的名称是 'unix'。

class csv.Sniffer
Sniffer 类用于推断 CSV 文件的格式。

Sniffer 类提供了两个方法:

sniff(sample, delimiters=None)
分析给定的 sample 并返回一个 Dialect 子类,该子类中包含了分析出的格式参数。如果给出可选的 delimiters 参数,则该参数会被解释为字符串,该字符串包含了可能的有效定界符。

import csvfile = open('csvDemo.csv', newline='')
dialect = csv.Sniffer().sniff(file.read(1024))
dialect.delimiter = ' '
dialect.quotechar = '|'
file.seek(0)reader = csv.reader(file, dialect)
for row in reader:for ceil in row:print(ceil)
file.close()# output: A1,B2,C3,D3,E3
# output: A4,B4,C4,D4,E4
# output: A4,B4,C4,D4,E4
# output: A4,B4,C4,D4,E4

has_header(sample)
分析 sample 文本(假定为 CSV 格式),如果发现其首行为一组列标题则返回 True。 在检查每一列时,将考虑是否满足两个关键标准之一来估计 sample 是否包含标题:

  • 第二至第 n 行包含数字值
  • 第二至第 n 行包含字符串值,其中至少有一个值的长度与该列预期标题的长度不同。

会对第一行之后的二十行进行采样;如果有超过一半的列 + 行符合标准,则返回 True。

import csvfile = open('csvDemo.csv', newline='')
dialect = csv.Sniffer().sniff(file.read(5))
dialect.delimiter = ' '
dialect.quotechar = '|'
file.seek(0)
print(csv.Sniffer().has_header(file.read(5)))
# output: True
file.close()

csv 模块定义了以下常量:

csv.QUOTE_ALL

指示 writer 对象给所有字段加上引号。

csv.QUOTE_MINIMAL

指示 writer 对象仅为包含特殊字符(例如 定界符引号字符 或 行结束符 中的任何字符)的字段加上引号。

csv.QUOTE_NONNUMERIC

指示 writer 对象为所有非数字字段加上引号。

指示 reader 将所有未用引号引出的字段转换为 float 类型。

csv.QUOTE_NONE

指示 writer 对象不使用引号引出字段。当 定界符 出现在输出数据中时,其前面应该有 转义符。如果未设置 转义符,则遇到任何需要转义的字符时,writer 都会抛出 Error 异常。

指示 reader 不对引号字符进行特殊处理。

csv 模块定义了以下异常:

exception csv.Error

该异常可能由任何发生错误的函数抛出。


变种与格式参数

创建 reader 或 writer 对象时,程序员可以将某个字符串或 Dialect 类的子类指定为 dialect 参数。

Dialect 类支持以下属性:

Dialect.delimiter

一个用于分隔字段的单字符,默认为 ','

Dialect.doublequote

控制出现在字段中的 引号字符 本身应如何被引出。

当该属性为 True 时,双写引号字符。默认值为 True。 如果该属性为 False,则在 引号字符 的前面放置 转义符

如果 doublequote 是 False,且 转义符 未指定,且在字段中发现 引号字符 时,会抛出 Error 异常。

Dialect.escapechar

一个用于 writer 的单字符,用来在 quoting 设置为 QUOTE_NONE 的情况下转义 定界符,在 doublequote 设置为 False 的情况下转义 引号字符。在读取时,escapechar 去除了其后所跟字符的任何特殊含义。该属性默认为 None,表示禁用转义。

Dialect.lineterminator

放在 writer 产生的行的结尾,默认为 '\r\n'

注解

reader 经过硬编码,会识别 '\r' 或 '\n' 作为行尾,并忽略 lineterminator。未来可能会更改这一行为。

Dialect.quotechar

一个单字符,用于包住含有特殊字符的字段,特殊字符如 定界符 或 引号字符 或换行符。默认为 '"'

Dialect.quoting

控制 writer 何时生成引号,以及 reader 何时识别引号。该属性可以等于任何 QUOTE_* 常量(参见 模块内容 段落),默认为 QUOTE_MINIMAL。

Dialect.skipinitialspace

如果为 True,则忽略 定界符 之后的空格。默认值为 False。

Dialect.strict

如果为 True,则在输入错误的 CSV 时抛出 Error 异常。默认值为 False


Reader 对象

Reader 对象(DictReader 实例和 reader() 函数返回的对象)具有以下公开方法:

csvreader.__next__()

返回 reader 的可迭代对象的下一行,它可以是一个列表(如果对象是由 reader() 返回)或字典(如果是一个 DictReader 实例),根据当前 Dialect 来解析。 通常你应当以 next(reader) 的形式来调用它。

Reader 对象具有以下公开属性:

csvreader.dialect

变种描述,只读,供解析器使用。

csvreader.line_num

源迭代器已经读取了的行数。它与返回的记录数不同,因为记录可能跨越多行。

DictReader 对象具有以下公开属性:

csvreader.fieldnames

字段名称。如果在创建对象时未传入字段名称,则首次访问时或从文件中读取第一条记录时会初始化此属性。

import csvfile = open('csvDemo.csv', newline='')
csvReader = csv.DictReader(file, delimiter=' ', quotechar='|')
print(csvReader.line_num)
for row in csvReader:print(csvReader.line_num)
print(csvReader.fieldnames)
file.close()# output: 0
# output: 2
# output: 3
# output: 4
# output: A2,B2,C2,D2,E2

Writer 对象

Writer 对象(DictWriter 实例和 writer() 函数返回的对象)具有下面的公开方法。对于 Writer 对象, 必须是(一组可迭代的)字符串或数字。对于 DictWriter 对象, 必须是一个字典,这个字典将字段名映射为字符串或数字(数字要先经过 str() 转换类型)。请注意,输出的复数会有括号包围。这样其他程序读取 CSV 文件时可能会有一些问题(假设它们完全支持复数)。

csvwriter.writerow(row)

将 row 形参写入到 writer 的文件对象,根据当前 Dialect 进行格式化。 返回对下层文件对象的 write 方法的调用的返回值。

csvwriter.writerows(rows)

将 rows*(即能迭代出多个上述 *row 对象的迭代器)中的所有元素写入 writer 的文件对象,并根据当前设置的变种进行格式化。

Writer 对象具有以下公开属性:

csvwriter.dialect

变种描述,只读,供 writer 使用。

DictWriter 对象具有以下公开方法:

DictWriter.writeheader()

在 writer 的文件对象中,写入一行字段名称(字段名称在构造函数中指定),并根据当前设置的变种进行格式化。本方法的返回值就是内部使用的 csvwriter.writerow() 方法的返回值。


标准库:csv --- CSV 文件读写相关推荐

  1. C++标准库实现WAV文件读写

    C++标准库实现WAV文件读写 在上一篇文章RIFF和WAVE音频文件格式中对WAV的文件格式做了介绍,本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依 ...

  2. python第三方库文件传输_Python第三方库在Excel文件读写中的应用

    Python第三方库在Excel文件读写中的应用 文/刘卫华1 史婷婷2 许学添1 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)016 [总页数 ...

  3. STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash

    STM32F103标准库开发----目录 W25Q128读写----程序源码----点击下载 W25Qxx全系列数据手册-点击下载 一.实验前期准备 本次实验的 MCU 是 STM32F103C8T6 ...

  4. Python学习笔记4——csv/excel文件读写保存

    工具包准备和设置检查 csv文件读写和保存 csv文件读写 csv文件保存 Excel工作表文件读写和保存 excel文件读写 excel文件保存 总结 附录代码 工具包准备和设置检查 相关工具包导入 ...

  5. py pandas 库及 excel 文件读写

    文章目录 1. 简介 1.1 df 读数据快速参考 2. DataFrame类 2.0 构造函数 2.1 index 2.2 观察data 2.3 筛选与过滤 2.4 增加/删除 column 2.5 ...

  6. c/c++标准库中的文件操作总结

    1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...

  7. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  8. Go 学习笔记(21)— 标准库 os 操作文件(新建、打开、写入、读取、删除、关闭文件)

    Go 操作文本文件时,与其它语言一样也有新建文件.打开文件.写文件.读文件.删除文件等操作.主要有两个标准库来提供这些操作,分别为 os 和 ioutil .在该文中我们介绍 os 模块. 1. 新建 ...

  9. python标准库os的方法listdir_使用python标准库快速修改文件名字

    大家在追剧的时候会一次性下载很多电影,但是很烦人的是前面会有很多电影网站的广告前缀. 今天我将介绍一个简短的代码,快速修改这些文件的名字. 工具:os 首先在电影目录下新建一个py文件,并导入os i ...

  10. Python标准库判断图片文件和声音文件的格式

    每种文件都有自己独特的文件头结构和数据组织形式,这些都会在specification中进行详细说明和描述. GIF文件的头结构比较简单,前4个字节是GIF8,例如: 但是其他图片文件的结构就复杂很多了 ...

最新文章

  1. 独家 | 对抗图像和攻击在Keras和TensorFlow上的实现
  2. html 选择列表框,列表框和组合框的区别是什么?
  3. Matlab循环读取txt文件并对其中数据进行计算最后导出为excel
  4. erlang精要(19)-以函数作为参数的函数,返回函数的函数(2)
  5. react 数组新增_React 新特性 Hooks 讲解及实例(二)
  6. JQUERY操作html--获取和设置内容、属性、回调函数
  7. CUDA初探—环境配置
  8. hihoCoder #1174:拓扑排序#183;一
  9. Swing表格JTable通过JTableModel插入行
  10. SDWebImage下载和缓存图片(UIImge)
  11. pngimg 可以商用吗_超级干货,30个无版权免费商用高清素材网站整理(设计师必备灵感源泉)...
  12. 北京地铁21号线_北京迎来地铁22号线,全长81公里,沿线的市民有福了
  13. 一、EulerOS 操作系统入门
  14. Effective Approaches to Attention-based Neural Machine Translation笔记
  15. 经典小游戏(密室逃脱全集+答案)
  16. 中国菜刀使用教程--ctf 文件上传
  17. eclipse离线安装PMD(含PMD离线包)
  18. List------数据结构
  19. 超超超级详细的java入门必备基础知识
  20. c语言编程培训网站,最新C语言编程培训

热门文章

  1. 技巧:Vimdiff 使用
  2. 网络协议-DNS与Hosts
  3. 树莓派使用PCA9685()出现[Errno 121] Remote I/O error的解决方法
  4. 邮件附件批量下载小程序
  5. Fiddler简单的使用教程(入门级)
  6. java中bean的作用域有哪些_Spring中Bean的5种作用域scope详解
  7. linux重启关机命令
  8. Laravel引入phpoffice/phpword替换Word文件内容
  9. python读取合并单元格并拆分合并单元格写出
  10. [Mysql] 多表连接查询