定义
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),
CSV格式是分隔的数据格式
存储方式:以纯文本形式存储表格数据(数字和文本)。
分割符
CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符为其它字符或字符串,最常见的是逗号或制表符。
规范
数据不跨行
以逗号(,)作为分隔符
如果字段中包含特殊字符(逗号,换行符),必须以双引号括住;
如果字段是空字符串,最好用双引号括住;
如果字段中包含特殊字符双引号,需要双写双引号来括住该字段
如content中包含”,则要用”“content”“
内码格式不限,可为 ASCII、Unicode 或者其他
不支持特殊字符,如果有特殊字符可能会导致分隔错误
写入文件时,最好提前进行编码检查,不然可能会导致错行
如果该字段内容为空,最好以双引号括住,不然可能会导致分隔错误
csv模块
#!/usr/bin/python
# -*- coding=utf-8 -*-
import csv
from collections import namedtuple
for row in csv.reader(['one,two,three']):
print row # one, two, three
# 1.csv格式如下
# name age
# a 1
# b 2
# 分隔符为',', 用双引号作为引用符(quotechar)
# 按行读取, 返回值为list
with open("1.csv") as f:
fcsv = csv.reader(f, delimiter = ",")
heading = next(fcsv)
# 创建命名元组时要注意, 如header的标题不合法,出现不能作为变量名的字符,如-=等
row = namedtuple('row', heading)
for i in fcsv:
print i, type(i) # ['a', '1'] <type 'list'>
i = row(*i)
print i, type(i) # row(name='a', age='1') <class '__main__.row'>
# 按行读取, 返回值为dict, 第一行为字典的key
with open("1.csv") as f:
fcsv = csv.DictReader(f)
for i in fcsv:
print i, type(i) # {'age': '2', 'name': 'b'} <type 'dict'>
headers = ("name", "age", "home")
rows = [(1,2,3), (4,5,6), (7,8,9)]
# 按行写入, 如果不以wb形式写, 会多一个换行
with open("write.csv", "wb") as f:
fcsv = csv.writer(f)
fcsv.writerow(headers)
fcsv.writerows(rows)
# 将字典中的内容对号入座
with open("write1.csv", "wb") as f:
fcsv = csv.DictWriter(f, headers)
fcsv.writeheader()
for i in range(len(rows)):
rows[i] = dict(zip(headers, rows[i]))
fcsv.writerows(rows)
csv的文件操作要使用wb, rb,这样会省去很多的问题。如在windows中不用wb的形式写入,会多空行,因为windows的换行符为\r\n
注意事项
- 当字段内容包含特殊符号(” , \n)时,要将该字段用”“括住,包含双引号的话用”“”“括住
- 如果该字段包含特殊字符,csv文件会出现编码错误,也会导致分隔失败