38 Python csv

来源:互联网 发布:今日方知我是我的诗句 编辑:程序博客网 时间:2024/05/30 23:04
  • 定义

    逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),

    CSV格式是分隔的数据格式

  • 存储方式:以纯文本形式存储表格数据(数字和文本)。

  • 分割符

    CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符为其它字符或字符串,最常见的是逗号或制表符。

  • 规范

    1. 数据不跨行

    2. 以逗号(,)作为分隔符

    3. 如果字段中包含特殊字符(逗号,换行符),必须以双引号括住;

      如果字段是空字符串,最好用双引号括住;

      如果字段中包含特殊字符双引号,需要双写双引号来括住该字段

      如content中包含”,则要用”“content”“

    4. 内码格式不限,可为 ASCII、Unicode 或者其他

    5. 不支持特殊字符,如果有特殊字符可能会导致分隔错误

      写入文件时,最好提前进行编码检查,不然可能会导致错行

    6. 如果该字段内容为空,最好以双引号括住,不然可能会导致分隔错误

csv模块

#!/usr/bin/python# -*- coding=utf-8 -*-import csvfrom collections import namedtuplefor row in csv.reader(['one,two,three']):    print row  # one, two, three# 1.csv格式如下# name  age# a     1# b     2# 分隔符为',', 用双引号作为引用符(quotechar)# 按行读取, 返回值为listwith 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, 第一行为字典的keywith 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

注意事项

  1. 当字段内容包含特殊符号(” , \n)时,要将该字段用”“括住,包含双引号的话用”“”“括住
  2. 如果该字段包含特殊字符,csv文件会出现编码错误,也会导致分隔失败

官方文档https://docs.python.org/2/library/csv.html