• 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)))
    
  • 相关阅读:
    linux系统中sed命令删除指定行后的下一行
    linux系统中删除文件的最后几行
    linux系统中sed命令删除指定行及其后的若干行
    linux系统中sed命令整行替换
    linux系统中sed命令在指定行前(后)插入内容
    CVE-2010-3333-office RTF栈溢出漏洞分析
    BM 算法
    HDFS 的 API 操作
    linux 服务器使用百度网盘
    linux 下配置java JDK1.8
  • 原文地址:https://www.cnblogs.com/wj5633/p/8944443.html
Copyright © 2020-2023  润新知