2010-05-25 7 views
3

У меня есть файл Excel .CSV, который я пытаюсь прочитать с помощью DictReader.Python DictReader - Пропуск строк с отсутствующими столбцами?

Все, кажется, хорошо, за исключением того, что он, кажется, пропускает строки, в частности те, у которых отсутствуют столбцы.

Наш вход выглядит следующим образом:

mail,givenName,sn,lorem,ipsum,dolor,telephoneNumber 
[email protected],ian,bay,3424,8403,2535,+65(2)34523534545 
[email protected],mike,gibson,3424,8403,2535,+65(2)34523534545 
[email protected],ross,martin,,,,+65(2)34523534545 
[email protected],david,connor,,,,+65(2)34523534545 
[email protected],chris,call,3424,8403,2535,+65(2)34523534545 

Таким образом, некоторые из строк имеют недостающие столбцы Lorem/Ipsum/Dolor, и это просто строка запятых для тех.

мы читаем его с:

def read_gd_dump(input_file="blah 20100423.csv"): 
    gd_extract = csv.DictReader(open('blah 20100423.csv'), restval='missing', dialect='excel') 
    return dict([(row['something'], row) for row in gd_extract]) 

И я проверил, что «что-то» (ключ для нашего Словаре) не один из недостающих столбцов, я изначально подозревал, что это может быть, , Это один из столбцов после этого.

Однако DictReader, похоже, полностью пропускает строки. Я попытался настроить restval на что-то, похоже, не имело никакого значения. Кажется, я ничего не могу найти в документах CSV Python (http://docs.python.org/library/csv.html), которые объясняли бы это поведение, но я, возможно, что-то неправильно понял.

ответ

1

Не удается воспроизвести вашу проблему - когда я сохранить эти данные, а затем назначить list(gd_extract), я вижу:

[{'telephoneNumber': '+65(2)34523534545', 'ipsum': '8403', 'sn': 'bay', 'dolor': '2535', 'mail': '[email protected]', 'givenName': 'ian', 'lorem': '3424'}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '8403', 'sn': 'gibson', 'dolor': '2535', 'mail': '[email protected]', 'givenName': 'mike', 'lorem': '3424'}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '', 'sn': 'martin', 'dolor': '', 'mail': '[email protected]', 'givenName': 'ross', 'lorem': ''}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '', 'sn': 'connor', 'dolor': '', 'mail': '[email protected]', 'givenName': 'david', 'lorem': ''}, {'telephoneNumber': '+65(2)34523534545', 'ipsum': '8403', 'sn': 'call', 'dolor': '2535', 'mail': '[email protected]', 'givenName': 'chris', 'lorem': '3424'}] 

пять dicts, в том числе с отсутствующими ipsum и т.д. Я боюсь, что в вашей похвальной попытке упрощая проблему, вы упростили ее, чтобы ваша ошибка исчезла.

Если у вас есть дубликаты в столбце something (не может проверить, так как вы не имеют, что столбец в данной выборке), что, конечно, объяснить «по-видимому недостающие» строки - они не хватают из возвращаемого потока читателя csv они получают «перезаписан» в dict, который вы возвращаете. Это может быть проблема?

+0

Woah, * the * Alex Materlli * ухмылка *. Hi =). Вы когда-нибудь обновляете Python в двух словах, кстати? Да, я упростил его как для упрощения чтения, так и для соображений конфиденциальности/соблюдения (место, в котором я работаю, скорее ... строгий). Оказывается, вы были правы, см. Редактировать выше. – victorhooi

+0

@victor, я должен был обновить Nutshell, но я узнал, что не могу сделать действительно отличную работу, если я действительно не использую версию Python, я должен обновить Nutshell до - я имею в виду в реальной жизни, как против того, чтобы играть с ним и отвечать на вопросы SO ;-). Мы скоро обновляемся на работе, чтобы в конечном итоге это изменилось! –

+0

Алекс, ага, с нетерпением жду этого =). У вас должен быть как голос, так и галочка (вот что я сделал с моей стороны). Проверить снова? Кроме того, я опубликовал следующий вопрос http://stackoverflow.com/questions/2901872/python-checking-for-membership-inside-nested-dict Я думаю, что у него довольно простое решение, я, вероятно, просто немного сплю -прибыл/запаздывал прямо сейчас. Благодарю. – victorhooi

0

Это не может быть ничего общего с вашей проблемой, и анализ Алекса вполне правдоподобно, учитывая отсутствие информации, но вы должны ВСЕГДА открыть файл CSV с "rb" или "wb" режиме (предполагается, что Python 2.x). Если вы этого не сделаете, вы рискуете различными таинственными событиями. Файл csv не является текстовым файлом, это файл BINARY.

В любом случае, пожалуйста, измените ваш вопрос, чтобы показать:
(1) (а) образец файла (б) сценарий (с) вывод - что вместе продемонстрировать предполагаемую проблему
(2), что версия Python вы работаете
(3), что OS

Update: Для Python 3.X, сделайте the blessed manual говорит: «» "Если csvfile является объектный файл, он должен быть открыт с newline='' Хотя этот совет включен только с csv.reader, он в равной степени относится к csv.writer, csv.DictReader и csv.DictWriter.

+0

Я использую Python 3.x - извините, я должен был это сказать. Означает ли это ваш совет относительно rb/wb? – victorhooi

Смежные вопросы