Было бы довольно просто использовать классы csv
DictReader
и DictWriter
модуля.Вот пример, который читает старый файл и записывает новый за один проход.
A DictReader
Экземпляр возвращает каждую логическую строку или строку файла как словарь, ключами которого являются имена полей.Вы можете явно указать имена полей или их можно прочитать из первой строки файла, как показано в примере.
Вы должны указать нужные имена полей при создании DictWriter
instance и порядок имен полей определяют порядок их появления в каждой строке выходного файла.В этом случае новое имя поля просто добавляется в начало списка имен из входного файла - какими бы они ни были.
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
Обратите внимание, что добавление данных для поля в каждую строку с dict(row, Node='node %s' % node)
, как показано, работает только тогда, когдаимя поля является допустимым аргументом ключевого слова (то есть действительным идентификатором Python) - например, Node
.
Допустимые идентификаторы состоят только из букв, цифр и символов подчеркивания, но не начинаются с цифры или символа подчеркивания и не могут быть ключевыми словамитакие как класс , для , возврат , глобальный , проход , печать (в Python 2) или повышение .
Чтобы обойти это ограничение, необходимо сделать это отдельно:
for node, row in enumerate(csvreader, 1):
row['Invalid Keyword'] = 'node %s' % node # add new field and value
csvwriter.writerow(row)