什么是CSV?
逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录。每个记录由一个或多个字段组成,用逗号分隔。使用逗号作为字段分隔符是此文件格式的名称的来源,因为分隔字符也可以不是逗号,有时也称为字符分隔值。
CSV广泛用于不同体系结构的应用程序之间交换数据表格信息,解决不兼容数据格式的互通问题,一般按照传输双方既定标准进行格式定义,而其本身并无明确格式标准。
CSV用逗号分隔字段的基本思想是清楚的,但是当字段数据也可能包含逗号或者甚至嵌入换行符时,该想法变得复杂。 CSV实现可能无法处理这些字段数据,或者可能会使用引号来包围字段。引用并不能解决所有问题:有些字段可能需要嵌入引号,因此CSV实现可能包含转义字符或转义序列。
RFC 4180提出了MIME类型(”text/csv”)对于CSV格式的标准,可以作为一般使用的常用定义,满足大多数实现似乎遵循的格式。
CSV格式储存
csv文件格式是一种通用的电子表格和数据库导入导出格式
1:西安邮电:西安:90
1,西安邮电,西安,90
# 读取csv文件l
import csv
with open('some.csv', 'rb') as f: # 采用b的方式处理可以省去很多问题
reader = csv.reader(f)
for row in reader:
# do something with row, such as row[0],row[1]
import csv
with open('some.csv', 'wb') as f: # 采用b的方式处理可以省去很多问题
writer = csv.writer(f)
writer.writerows(someiterable)
"""
import csv
with open('doc/example.csv', 'w') as f:
writer = csv.writer(f)
# 将列表的每条数据依次写入csv文件, 并以逗号分隔
writer.writerows([['1', '2', '3'], ['4', '5', '6']])
with open('doc/example.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print(row)
关于CSV文件解析
上面说过,CSV并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:
纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
由记录组成(典型的是每行一条记录);
每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
每条记录都有同样的字段序列。
所以,在常规的约束条件下,存在着许多CSV变体,故CSV文件并不完全互通,如使用约定好的其他分隔符、转义规则等。因此,实际使用CSV需要数据交换双方约定规则(其实大体思路不变,一些细节),在进行CSV文件读写就免不了进行文件的解析。
正如CSV并不明确的格式,CSV文件的解析同样没有标准方法,一般可以自己实现读写,网上也有很多种不同语言的实现版本。例如opencsv、csvreader等。它们可能会与RFC中的规定有所出入,例如在csvreader中有要求:
前缀和后缀的空格字符,逗号和制表符,与逗号或记录分隔符相邻的内容将被修剪。
为了保证前导和后缀空白字符的保留,必须通过将字段嵌入到双引号集合中来限定字段。