Как добавить новый столбец в начало файла CSV? - PullRequest
4 голосов
/ 02 февраля 2011

У меня есть один CSV-файл, в котором у меня есть от 6 до 8 столбцов.
Пример:

ID Test Description file-name module view path1 path2 

Я хочу добавить новый столбец (Node) в начало.
Пример:

Node ID Test Description file-name module view path1 path2 

Ответы [ 2 ]

15 голосов
/ 02 февраля 2011

Было бы довольно просто использовать классы 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)
4 голосов
/ 02 февраля 2011

Вы можете использовать модуль 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...