使用csv
模块的DictReader
and DictWriter
类。下面是一个示例,它一次性读取旧文件并写入新文件。
A DictReader
实例将文件的每个逻辑行或行作为字典返回,其键是字段名称。您可以显式指定字段名称,也可以从文件的第一行读取它们(如下面的示例所示)。
You must创建时指定所需的字段名称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
.
有效标识符只能由字母、数字和下划线组成,但不能以数字或下划线开头,并且不能是语言关键字,例如class
, for
, return
, global
, pass
, etc.
此限制的解决方法是更新每个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)