(转)csv — 逗号分隔值文件格式
原文:https://pythoncaff.com/docs/pymotw/csv-comma-separated-value-files/125
csv
模块主要用于处理从电子数据表格或数据库中导入到文本文件的数据,通常简称为comma-separated value (CSV)格式因为逗号用于分离每条记录的各个字段。
读取##
从 CSV 文件中读取数据, 可以使用 reader()
函数来创建一个读取对象。 这个读取对象顺序处理文件的每一行,可以把它当成迭代器使用, 例如:
csv_reader.py
import csv
import syswith open(sys.argv[1], 'rt') as f: reader = csv.reader(f) for row in reader: print(row)
reader()
的第一个参数指源文本,在这个例子中,是一个文件,但它可以是任何可迭代对象( StringIO
实例,list
等)。第二个参数是可选的,可用于控制输入的数据如何被解析。
"Title 1","Title 2","Title 3","Title 4" 1,"a",08/18/07,"å" 2,"b",08/19/07,"∫" 3,"c",08/20/07,"ç"
它被读取时,输入数据的每一行被转换为一个字符串列表。
$ python3 csv_reader.py testdata.csv['Title 1', 'Title 2', 'Title 3', 'Title 4'] ['1', 'a', '08/18/07', 'å'] ['2', 'b', '08/19/07', '∫'] ['3', 'c', '08/20/07', 'ç']
解析器会自动处理嵌入在一行字符串中的换行符,这也是输出中的一行数据可能和输入的一行不同的原因。
"Title 1","Title 2","Title 3" 1,"first line second line",08/18/07
输入中带有换行符的字段在解析器返回时保留内部换行符。
$ python3 csv_reader.py testlinebreak.csv['Title 1', 'Title 2', 'Title 3'] ['1', 'first line\nsecond line', '08/18/07']
写入##
写入 CSV 文件和读取它们一样简单。使用 writer()
方法创建一个写入对象,然后使用 writerow()
去输出每一行。
csv_writer.py
import csv
import sysunicode_chars = 'å∫ç'with open(sys.argv[1], 'wt') as f: writer = csv.writer(f) writer.writerow(('Title 1', 'Title 2', 'Title 3', 'Title 4')) for i in range(3): row = ( i + 1, chr(ord('a') + i), '08/{:02d}/07'.format(i + 1), unicode_chars[i], ) writer.writerow(row) print(open(sys.argv[1], 'rt').read())
这个例子的输出和上面读取的例子看起来有些不同,是因为这里有的值没有加引号。
$ python3 csv_writer.py testout.csvTitle 1,Title 2,Title 3,Title 4 1,a,08/01/07,å 2,b,08/02/07,∫ 3,c,08/03/07,ç
引用##
写入时,默认的引用行为不同,所以之前示例中的第二和第三个字段未被引用。 要添加引号,请将 quoting
参数设置为其他引用模式。
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
在这个例子中, QUOTE_NONNUMERIC
会给所有字段值不是数字的值添加引号。
$ python3 csv_writer_quoted.py testout_quoted.csv"Title 1","Title 2","Title 3","Title 4" 1,"a","08/01/07","å" 2,"b","08/02/07","∫" 3,"c","08/03/07","ç"
有四种不同的引用选项,在 csv 模块中被定义为常量。
QUOTE_ALL
无论什么类型的字段都会被引用。
QUOTE_MINIMAL
这是默认的选项, 使用指定的字符引用各字段(如果解析器被配置为相同的dialect和选项时,可能会让解析器在解析时产生混淆)。
QUOTE_NONNUMERIC
引用那些不是整数或浮点数的字段。当使用读取对象时, 如果输入的字段是没有引号的, 那么它们会被转换成浮点数。
QUOTE_NONE
对所有的输出内容都不加引用,当使用读取对象时,引用字符看作是包含在每个字段的值里(但在正常情况下,它们被当成定界符而被去掉)。
编码风格##
其实没有一个标准定义这类逗号分隔值的文件,所以解析器需要很灵活,通过很多参数去控制如何解析 csv
或给其写入数据。但这并不是每个参数在写入或读取 csv 时分别传入,而是统一分组为一个 编码风格 对象。
Dialect 类可以通过名字注册,因此 csv
模块调用它时不必预先知道相关的参数设置。所有注册过的编码风格列表可以通过 list_dialects()
方法查看。
csv_list_dialects.py
import csvprint(csv.list_dialects())
标准库提供了三种编码风格,分别为: excel
, excel-tabs
和 unix
。 excel
编码风格用来处理默认来自 Microsoft Excel 格式的数据的,同样可用于处理来自 LibreOffice 格式的。 unix
编码风格将所有字段通过双引号引用,并用 \n
做为每条记录的分隔符。
$ python3 csv_list_dialects.py['excel', 'excel-tab', 'unix']
创建一个编码风格##
如果不使用逗号分隔字段,输入文件使用竖杠( |
),就像这样
"Title 1"|"Title 2"|"Title 3" 1|"first line second line"|08/18/07
一个新的编码风格可以使用不同的分隔符进行注册。
csv_dialect.py
import csvcsv.register_dialect('pipes', delimiter='|') with open('testdata.pipes', 'r') as f: reader = csv.reader(f, dialect='pipes') for row in reader: print(row)
使用「竖杠」的编码风格,可以像使用逗号一样读取文件。
$ python3 csv_dialect.py['Title 1', 'Title 2', 'Title 3'] ['1', 'first line\nsecond line', '08/18/07']
编码风格参数##
编码风格指定解析或写入数据文件时使用的所有标记。下表列出了可以设定的属性,从字段的分隔方式到用于转义标记的字符。
CSV 编码风格参数
属性 | 默认 | 含义 |
---|---|---|
delimiter |
,
|
字段分隔符(单字符) |
doublequote | True | 控制 quotechar 实例是否翻倍 |
escapechar | None | 用于表示转义序列的字符 |
lineterminator |
\r\n
|
写入时用来换行的字符 |
quotechar |
"
|
引用含特殊值字段的字符(一个字符) |
quoting |
QUOTE_MINIMAL
|
控制前面表述的引用行为 |
skipinitialspace | False | 是否在字段分隔符后忽略空格 |
csv_dialect_variations.py
import csv
import syscsv.register_dialect('escaped', escapechar='\\', doublequote=False, quoting=csv.QUOTE_NONE, ) csv.register_dialect('singlequote', quotechar="'", quoting=csv.QUOTE_ALL, ) quoting_modes = { getattr(csv, n): n for n in dir(csv) if n.startswith('QUOTE_') } TEMPLATE = '''\ Dialect: "{name}" delimiter = {dl!r:<6} skipinitialspace = {si!r} doublequote = {dq!r:<6} quoting = {qu} quotechar = {qc!r:<6} lineterminator = {lt!r} escapechar = {ec!r:<6} ''' for name in sorted(csv.list_dialects()): dialect = csv.get_dialect(name) print(TEMPLATE.format( name=name, dl=dialect.delimiter, si=dialect.skipinitialspace, dq=dialect.doublequote, qu=quoting_modes[dialect.quoting], qc=dialect.quotechar, lt=dialect.lineterminator, ec=dialect.escapechar, )) writer = csv.writer(sys.stdout, dialect=dialect) writer.writerow( ('col1', 1, '10/01/2010', 'Special chars: " \' {} to parse'.format( dialect.delimiter)) ) print()
这段程序演示了当使用几种不同的编码风格格式化时,相同的数据如何展示。
$ python3 csv_dialect_variations.pyDialect: "escaped"delimiter = ',' skipinitialspace = 0 doublequote = 0 quoting = QUOTE_NONE quotechar = '"' lineterminator = '\r\n' escapechar = '\\' col1,1,10/01/2010,Special chars: \" ' \, to parse Dialect: "excel" delimiter = ',' skipinitialspace = 0 doublequote = 1 quoting = QUOTE_MINIMAL quotechar = '"' lineterminator = '\r\n' escapechar = None col1,1,10/01/2010,"Special chars: "" ' , to parse" Dialect: "excel-tab" delimiter = '\t' skipinitialspace = 0 doublequote = 1 quoting = QUOTE_MINIMAL quotechar = '"' lineterminator = '\r\n' escapechar = None col1 1 10/01/2010 "Special chars: "" ' to parse" Dialect: "singlequote" delimiter = ',' skipinitialspace = 0 doublequote = 1 quoting = QUOTE_ALL quotechar = "'" lineterminator = '\r\n' escapechar = None 'col1','1','10/01/2010','Special chars: " '' , to parse' Dialect: "unix" delimiter = ',' skipinitialspace = 0 doublequote = 1 quoting = QUOTE_ALL quotechar = '"' lineterminator = '\n' escapechar = None "col1","1","10/01/2010","Special chars: "" ' , to parse"
自动检测编码风格##
配置一个输入文件的编码风格的最好的办法是提前知道哪种编码风格是正确的。对于那些编码风格未知的参数, Sniffer
类可用于做有效的猜测。 sniff()
方法会获取输入数据的一个样本和一个可选参数,给出可能的分隔符。
csv_dialect_sniffer.py
import csv
from io import StringIO
import textwrap csv.register_dialect('escaped', escapechar='\\', doublequote=False, quoting=csv.QUOTE_NONE) csv.register_dialect('singlequote', quotechar="'", quoting=csv.QUOTE_ALL) # 为所有已知的编码风格生成样本数据 samples = [] for name in sorted(csv.list_dialects()): buffer = StringIO() dialect = csv.get_dialect(name) writer = csv.writer(buffer, dialect=dialect) writer.writerow( ('col1', 1, '10/01/2010', 'Special chars " \' {} to parse'.format( dialect.delimiter)) ) samples.append((name, dialect, buffer.getvalue())) # 猜测样本的编码风格,然后用猜测结果来解析数据。 sniffer = csv.Sniffer() for name, expected, sample in samples: print('Dialect: "{}"'.format(name)) print('In: {}'.format(sample.rstrip())) dialect = sniffer.sniff(sample, delimiters=',\t') reader = csv.reader(StringIO(sample), dialect=dialect) print('Parsed:\n {}\n'.format( '\n '.join(repr(r) for r in next(reader))))
sniff()
方法返回一个包含了解析数据的参数的 Dialect
实例。结果并不一定是正确的,例如这个例子中的「escaped」。
$ python3 csv_dialect_sniffer.pyDialect: "escaped"
In: col1,1,10/01/2010,Special chars \" ' \, to parse Parsed: 'col1' '1' '10/01/2010' 'Special chars \\" \' \\' ' to parse' Dialect: "excel" In: col1,1,10/01/2010,"Special chars "" ' , to parse" Parsed: 'col1' '1' '10/01/2010' 'Special chars " \' , to parse' Dialect: "excel-tab" In: col1 1 10/01/2010 "Special chars "" ' to parse" Parsed: 'col1' '1' '10/01/2010' 'Special chars " \' \t to parse' Dialect: "singlequote" In: 'col1','1','10/01/2010','Special chars " '' , to parse' Parsed: 'col1' '1' '10/01/2010' 'Special chars " \' , to parse' Dialect: "unix" In: "col1","1","10/01/2010","Special chars "" ' , to parse" Parsed: 'col1' '1' '10/01/2010' 'Special chars " \' , to parse'
使用字段名称##
除了处理数据序列之外,csv
模块还提供了用于处理将字典作为行的类,以便可以对字段进行命名。 DictReader
和 DictWriter
将行翻译成字典而不是序列。字典的键可以被传入或者从输入的第一行(当该行包含标题时)推断出来。
csv_dictreader.py
import csv
import syswith open(sys.argv[1], 'rt') as f: reader = csv.DictReader(f) for row in reader: print(row)
基于字典的读取器和写入器被实现为基于序列的类的包装器,并使用相同的方法和参数。读取器唯一的区别是行作为 OrderedDict
实例返回而不是列表或者元组(早期的 Python 版本中,行作为常规 dict
实例返回)。
$ python3 csv_dictreader.py testdata.csvOrderedDict([('Title 1', '1'), ('Title 2', 'a'), ('Title 3', '08/18/07'), ('Title 4', 'å')]) OrderedDict([('Title 1', '2'), ('Title 2', 'b'), ('Title 3', '08/19/07'), ('Title 4', '∫')]) OrderedDict([('Title 1', '3'), ('Title 2', 'c'), ('Title 3', '08/20/07'), ('Title 4', 'ç')])
必须要给 DictWriter
一个字段名称列表,以至于让它在输出的时候如何排序。
csv_dictwriter.py
import csv
import sysfieldnames = ('Title 1', 'Title 2', 'Title 3', 'Title 4') headers = { n: n for n in fieldnames } unicode_chars = 'å∫ç' with open(sys.argv[1], 'wt') as f: writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() for i in range(3): writer.writerow({ 'Title 1': i + 1, 'Title 2': chr(ord('a') + i), 'Title 3': '08/{:02d}/07'.format(i + 1), 'Title 4': unicode_chars[i], }) print(open(sys.argv[1], 'rt').read())
字段名称不会被自动写入到文件,但是他们可以显示地使用 writeheader()
方法写入。
$ python3 csv_dictwriter.py testout.csvTitle 1,Title 2,Title 3,Title 4 1,a,08/01/07,å 2,b,08/02/07,∫ 3,c,08/03/07,ç
转载于:https://www.cnblogs.com/liujiacai/p/9883145.html
(转)csv — 逗号分隔值文件格式相关推荐
- CSV (逗号分隔值文件格式)
CSV (逗号分隔值文件格式) 编辑 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本) ...
- csv逗号分隔值文件_如何将逗号分隔值(CSV)文件拆分为SQL Server列
csv逗号分隔值文件 Receiving a comma delimited file is not new technology nor is it difficult to deal with i ...
- [概念]CSV逗号分隔值
csv(Comma Separated Values)逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不 ...
- CSV逗号分隔值文件
规则 0 开头是不留空,以行为单位. 1 可含或不含列名,含列名则居文件第一行. 2 一行数据不垮行,无空行. 3 以半角符号,作分隔符,列为空也要表达其存在. 4 列内容如存在半角逗号(即,)则用半 ...
- CSV逗号分隔值格式文件(示例分析)
CSV全称Comma Separated Values是"逗号分隔值"的英文缩写.通常是纯文本文件,可以被文本编辑软件,Excel或WPS表格打开. 基本规则 开头不留空,以行为单 ...
- csv(逗号分隔值)文件用Excel编辑
在阅读<集体智慧编程>时,看到了csv文件,咋看起来跟Excel文件样子很像,具体百度吧. 这里记录下怎么用Excel来编辑csv文件. csv文件直接用记事本打开,可以看见每个字段都是用 ...
- Python3 —— 逗号分隔值CSV
Python3 -- 逗号分隔值CSV 目录 Python3 -- 逗号分隔值CSV CSV 读写CSV文件 CSV 逗号分隔值( Comma-Separated Value, CSV).与专有的二进 ...
- CSV(Comma-Separate-Values)逗号分隔值文件
文章目录 前言 一.CSV文件背景 二.CSV文件用法 三.CSV文件规则 四.CSV文件包含的各种数据 1.常规的内容 2.字段内部有逗号 3.字段内部有引号 4.字段内部有换行符 5.字段内部有空 ...
- 字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
最新文章
- InfluxDB基本使用说明
- 最小生成树之prim算法
- python数据统计代码_Python 数据的累加与统计的示例代码
- Redis 3.0.1 安装和配置
- java如何寻找main函数对应的类
- linux 脚本批量删除,Linux Shell使用Bash脚本批量删除文件
- python解析xml文件选用模块_Python标准库系列之xml模块
- 由于连接方在一段时间后没有正确答复或连接的主机_新风换气机使用效果不佳,为何?掌握正确使用方法就好了...
- 微擎系统 微信支付 get_brand_wcpay_request:fail
- javaweb课程设计之XXX管理系统
- 前端-图片压缩,基于vue/webpack的tinypng插件
- 【C++沉思录】代理类
- Python + Face_recognition人脸识别之考勤统计
- 利用WireShark分析H264码流
- pythyon爬虫实现12306查票
- git提交代码失败 ‘“node“‘ �����ڲ����ⲿ���Ҳ���ǿ����еij������������ļ��� 解决方法
- 《炬丰科技-半导体工艺》MEMS 应用中不同厚光刻胶的比较研究
- The first interview for xiecheng
- excel如何提取图片中的文字?
- 2022年学习机器人和人工智能的一些体会
热门文章
- 又4所高校加入!华为‘智能基座’产教融合协同育人基地”项目
- 告别被拒,如何提升iOS审核通过率(下篇)——应用内容检查大法与提审资源检查大法...
- iis8 php环境搭建,IIS8 使用FastCGI配置PHP环境图文教程
- 变废为宝:使用废旧手机实现实时监控方案
- 安编程中使用handleMessage实现线程之间数据交互
- C++11 chrono的基本使用
- linux安装sendmail服务器,linux下Sendmail 服务器的搭建(图文)
- Java精品项目源码第113期健身器材商城系统
- 关于nacos无限刷日志的问题解决过程
- 2023年常见的20道JavaScript面试题及其答案解析,你知道多少