Python标准库--csv模块

csv模块

读写逗号分隔值的文件

一、准备文件

csv_test.csv

user,passwd,date
a1,a2,2018-04-23
b1,b2,2018-04-24
c1,c2,2018-04-25

二、读文件

  • reader()
    with open("csv_test.csv", "rt") as f:
        reader = csv.reader(f)

        for row in reader:
            print(row)
['user', 'passwd', 'date']
['a1', 'a2', '2018-04-23']
['b1', 'b2', '2018-04-24']
['c1', 'c2', '2018-04-25']
  • DictReader()
    with open("csv_test.csv", "rt") as f:
        dict_reader = csv.DictReader(f)

        for row in dict_reader:
            print(row)
            # print(row.get('user'), row.get('passwd'), row.get('date'))
OrderedDict([('user', 'a1'), ('passwd', 'a2'), ('date', '2018-04-23')])
OrderedDict([('user', 'b1'), ('passwd', 'b2'), ('date', '2018-04-24')])
OrderedDict([('user', 'c1'), ('passwd', 'c2'), ('date', '2018-04-25')])

可以看出区别一个是list, 一个是OrderedDict,在切换注释,使用get取值:

a1 a2 2018-04-23
b1 b2 2018-04-24
c1 c2 2018-04-25

使用DictReader()读取文件,会使用第一行的值当key和后面每一行组成一个OrderedDict,这样取值使用更方便

  • fieldnames 第一行字段名
    with open(path, "rt") as f:
        dict_reader = csv.DictReader(f)

        print(dict_reader.fieldnames)
['user', 'passwd', 'date']
  • 当数据不包含数据字段名时,可以指定字段名

准备 csv 文件:

    a1,a2,2018-04-23
    b1,b2,2018-04-24
    c1,c2,2018-04-25

代码如下:

    fieldnames = ['user', 'passwd', 'date']
    with open("csv_test.csv", "rt") as f:
        dict_reader = csv.DictReader(f, fieldnames=fieldnames)

        print(dict_reader.fieldnames)
        print("===========================")
        for row in dict_reader:
            print(row.get(fieldnames[0]), row.get(fieldnames[1]), row.get(fieldnames[2]))

运行代码:

['user', 'passwd', 'date']
===========================
a1 a2 2018-04-23
b1 b2 2018-04-24
c1 c2 2018-04-25

三、写文件

  • writer()
    with open("csv_test.csv", "wt") as f:
        writer = csv.writer(f)

        writer.writerow(('user', 'passwd', 'date'))

        for i in range(3):
            writer.writerow((i + 1, chr(ord('a') + i), '2018-%02d-45' % (i+1)))
  • DictWriter()
    fieldnames = ['user', 'passwd', 'date']
    with open(path, "wt") as f:
        dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
        headers = dict((n, n) for n in fieldnames)
        dict_writer.writerow(headers)
        for i in range(3):
            data = (i + 1, chr(ord('a') + i), '2018-%02d-45' % (i + 1))
            values = {}
            for index in range(len(fieldnames)):
                values[fieldnames[index]] = data[index]
            dict_writer.writerow(values)

DictWriter()需要单独写入文件头行

四、逐行读取

  • reader()
    reader = csv.reader(open("csv_test.csv", "rt"))

    print(next(reader))
    print(next(reader))
    print(next(reader))
  • DictReader()
    def test(dict_reader):
        for row in dict_reader:
            yield row.get(fieldnames[0]), row.get(fieldnames[1]), row.get(fieldnames[2])


    dict_reader = csv.DictReader(open("csv_test.csv", "rt"))
    fieldnames = ['user', 'passwd', 'date']
    print(next(test(dict_reader)))
    print(next(test(dict_reader)))
    print(next(test(dict_reader)))
posted @ 2018-04-25 14:20  兔头咖啡  阅读(314)  评论(2编辑  收藏  举报


作者:兔头咖啡
出处:http://www.cnblogs.com/wj5633/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。