Python DictReader - пропустить строки с отсутствующими столбцами? - PullRequest
3 голосов
/ 25 мая 2010

У меня есть файл Excel .CSV, который я пытаюсь прочитать с помощью DictReader.

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

Наш вклад выглядит так:

mail,givenName,sn,lorem,ipsum,dolor,telephoneNumber
ian.bay@blah.com,ian,bay,3424,8403,2535,+65(2)34523534545
mike.gibson@blah.com,mike,gibson,3424,8403,2535,+65(2)34523534545
ross.martin@blah.com,ross,martin,,,,+65(2)34523534545
david.connor@blah.com,david,connor,,,,+65(2)34523534545
chris.call@blah.com,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)), которое могло бы объяснить это поведение, но я мог что-то неправильно прочитать.

Ответы [ 2 ]

1 голос
/ 25 мая 2010

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

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

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

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

0 голосов
/ 25 мая 2010

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

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

Обновление: для Python 3.X выполните как в благословленном руководстве : "" "Если csvfile является файловым объектом, его следует открыть с помощью newline=''. Хотя этот совет включен только с csv.reader, это в равной степени относится к csv.writer, csv.DictReader и csv.DictWriter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...