Проблемы с Python CSV DictReader / Writer - PullRequest
3 голосов
/ 30 июля 2009

Я пытаюсь извлечь несколько строк из файла CSV и записать их в другой, но у меня возникли некоторые проблемы.

import csv

f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames

target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)

while True:
try:
    row = r.next()
    if r.line_num <= 2: #first two rows don't matter
        continue
    else:
        w.writerow(row)

except StopIteration:
    break

f.close()
target.close()

Запустив это, я получаю следующую ошибку:

Traceback (most recent call last):
File "unify.py", line 16, in <module>
    w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
    return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
    if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable

Не совсем уверен, в чем я не прав.

Ответы [ 4 ]

13 голосов
/ 29 августа 2010

Чтобы устранить путаницу с ошибкой: вы получаете ее, потому что r.fieldnames устанавливается только после первого чтения из входного файла с использованием r. Следовательно, как вы и написали, fieldnames всегда будет инициализироваться как None.

Вы можете инициализировать w = csv.DictWriter(united, fieldnames=fieldnames) с r.fieldnames только после прочтения первой строки из r, что означает, что вам придется реструктурировать свой код.

Это поведение описано в документации Стандартная библиотека Python

Объекты DictReader имеют следующий открытый атрибут:

csvreader.fieldnames

Если этот параметр не передан в качестве параметра при создании объекта, этот атрибут инициализируется при первом доступе или при чтении первой записи из файла.

13 голосов
/ 30 июля 2009

Я тоже не знаю, но поскольку все, что вы делаете, это копирование строк из одного файла в другой, почему вы вообще беспокоитесь о вещах csv? Почему не что-то вроде:

f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')

f.readline()
f.readline()
for line in f:
    target.write(line)
1 голос
/ 10 марта 2010

Причина, по которой вы получаете ошибку, заключается в том, что ваш исходный CSV-файл (my_csv_file.csv) не имеет строки заголовка. Поэтому, когда вы создаете объект чтения, его поле fieldnames устанавливается в None.

Когда вы пытаетесь записать строку, используя программу записи, она сначала проверяет, нет ли в dict ключей, которых нет в списке известных полей. Поскольку fieldnames имеет значение None, попытка разыменования имени ключа вызывает исключение.

1 голос
/ 16 августа 2009

Что касается исключения, выглядит так:

w = csv.DictWriter(united, fieldnames=fieldnames)

должно быть

w = csv.DictWriter(target, fieldnames=fieldnames)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...