如何在CSV文件的开头添加新列?

时间:2011-02-02 08:10:41

标签: python csv updates

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

ID Test Description file-name module view path1 path2 

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

Node ID Test Description file-name module view path1 path2 

2 个答案:

答案 0 :(得分:14)

使用csv模块的DictReaderDictWriter类非常容易。这是一个读取旧文件并以单一传递方式写入新文件的示例。

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

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

import csv

with open('testdata.txt', 'rb') as inf, open('testdata2.txt', 'wb') 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, 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

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

有效标识符仅由字母,数字和下划线组成,但不以数字或下划线开头,并且不能是语言关键字,例如 class for 返回全局传递打印(在Python 2中)或 raise 。< / p>

要解决这个限制,有必要单独进行:

    for node, row in enumerate(csvreader, 1):
        row['Invalid Keyword'] = 'node %s' % node  # add new field and value
        csvwriter.writerow(row)

答案 1 :(得分:4)

您可以使用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'])