【问题标题】:How to add a new column to the beginning of the rows of a CSV file?如何在 CSV 文件的行开头添加新列?
【发布时间】:2011-02-02 08:10:41
【问题描述】:

我有一个 csv 文件,其中有 6 到 8 列。
例如:

ID Test Description file-name module view path1 path2 

我想在开头添加新列 (Node)。
例如:

Node ID Test Description file-name module view path1 path2 

【问题讨论】:

    标签: python csv updates


    【解决方案1】:

    使用csv 模块的DictReaderDictWriter 类相当容易。这是一个读取旧文件并一次性写入新文件的示例。

    DictReader 实例将文件的每个逻辑行或行作为字典返回,其键是字段名称。您可以明确指定字段名称,也可以从文件的第一行读取它们(如下例所示)。

    必须在创建DictWriter 实例时指定所需的字段名称,并且字段名称的顺序定义了它们在输出文件的每一行中出现的顺序。在这种情况下,新字段名称只是简单地添加到输入文件中名称列表的开头——无论它们是什么。

    import csv
    
    with open('testdata.txt', 'r', newline='') as inf, \
         open('testdata2.txt', 'w', newline='') as outf:
        csvreader = csv.DictReader(inf)
        fieldnames = ['Node'] + csvreader.fieldnames  # Add column name to beginning.
        csvwriter = csv.DictWriter(outf, fieldnames)
        csvwriter.writeheader()
        for node, row in enumerate(csvreader, start=1):
            csvwriter.writerow(dict(row, Node='node %s' % node))
    

    如果这是输入文件的内容:

    ID,Test Description,file-name,module,view,path1,path2
    id 1,test 1 desc,test1file.txt,test1module,N,test1path1,test1path2
    id 2,test 2 desc,test2file.txt,test2module,Y,test2path1,test2path2
    id 3,test 3 desc,test3file.txt,test3module,Y,test3path1,test3path2
    id 4,test 4 desc,test4file.txt,test4module,N,test4path1,test4path2
    id 5,test 5 desc,test5file.txt,test5module,Y,test5path1,test5path2
    

    这将是运行脚本后生成的输出文件的内容:

    Node,ID,Test Description,file-name,module,view,path1,path2
    node 1,id 1,test 1 desc,test1file.txt,test1module,N,test1path1,test1path2
    node 2,id 2,test 2 desc,test2file.txt,test2module,Y,test2path1,test2path2
    node 3,id 3,test 3 desc,test3file.txt,test3module,Y,test3path1,test3path2
    node 4,id 4,test 4 desc,test4file.txt,test4module,N,test4path1,test4path2
    node 5,id 5,test 5 desc,test5file.txt,test5module,Y,test5path1,test5path2
    

    请注意,将字段的数据添加到带有 dict(row, Node='node %s' % node) 的每一行中,仅当字段名称是有效的关键字参数(即有效的 Python 标识符)时才有效 - 例如 Node

    有效标识符仅由字母、数字和下划线组成,但不能以数字或下划线开头,不能是语言关键字如classforreturnglobalpass

    解决此限制的方法是手动更新每个 row 字典,因为字段名称不能用作关键字参数:

        fieldnames = ['Invalid-Identifier''] + csvreader.fieldnames  # Add column name.
        ...
        for node, row in enumerate(csvreader, 1):
            row['Invalid-Identifier'] = 'node %s' % node  # add new field and value
            csvwriter.writerow(row)
    

    【讨论】:

      【解决方案2】:

      您可以使用 CSV 模块读取您的 CSV 文件并写出带有附加列的编辑版本。请记住,添加一列就是在每行的末尾添加一个额外的条目。

      使用 CSV 模块输出的示例 (http://docs.python.org/library/csv.html)

      >>> import csv
      >>> spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ',
      ...                         quotechar='|', quoting=csv.QUOTE_MINIMAL)
      >>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
      >>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
      

      【讨论】:

      • delimiter=' ' 委婉地说有点不典型。
      • 如何添加新列?这只会覆盖整个 csv 文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2013-07-25
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2017-09-11
      • 2022-01-04
      相关资源
      最近更新 更多