dict () — Python 2.7 Начиная с 3.5 —

После работы над моим прототипом я все еще пытаюсь сравнить два файла CSV. На этот раз я использую словарь.

Мой первый файл выглядит примерно так:

IP
192.168.10.1
192.168.10.15
192.168.10.32

Один единственный столбец с IP-адресами.

Я хочу проверить, являются ли эти IP-адреса также другим файлом с именем epoch.csv. Если да, я пишу файл CSV с копией строки в epoch.csv.

В Python 2.7 я написал этот код, который работает гладко:

with open('IP.csv', 'r') as master:
    enum = csv.reader(master)
    master_indices = dict((r[0], i) for i, r in enumerate(enum))


with open('epoch.csv', 'r') as hosts:
    with open('result.csv', 'w') as results:
        reader = csv.reader(hosts)
        writer = csv.writer(results)

        for row in reader:
            index = master_indices.get(row[1])
            if index is not None:
                writer.writerow(row)

НО, когда я пытаюсь запустить этот код с Python 3.5 (Windows), я получаю эту ошибку:

File "IP.py", line 43, in (module)
master_indices = dict((r[0], i) for i, r in enumerate(enum))
File "IP.py", line 43, in (genexpr)
master_indices = dict((r[0], i) for i, r in enumerate(enum))
IndexError: list index out of range

Почему в одном случае работает, а в другом нет. Я мог бы, конечно, переустановить 2.7 на всех своих машинах, но я хотел бы понять, почему это не работает...

ИЗМЕНИТЬ:

Итак, учитывая csv.DictReader, я думаю, что могу изменить эту строку:

with open('IP.csv', 'r') as master:
    enum = csv.reader(master)
    master_indices = dict((r[0], i) for i, r in enumerate(enum))

с чем-то гораздо более простым, как это:

with open('IP.csv', 'r') as master:
    enum = csv.Dict.Reader(master)

Это правильно?


person hpiedcoq    schedule 17.11.2015    source источник
comment
Python предоставляет DictReader.   -  person Cyrbil    schedule 17.11.2015
comment
Хорошо, поэтому я проверяю и редактирую свой код   -  person hpiedcoq    schedule 17.11.2015
comment
Это похоже на признак того, что csv находит пустую строку в конце входного файла. Не уверен, почему это повлияет только на 3.5, но я бы убедился, что файл не заканчивается пустой строкой, и/или отфильтровал вывод, изменив инициализацию master_indices на master_indices = {r[0]: i for i, r in enumerate(enum) if r}, чтобы исключить пустые строки.   -  person ShadowRanger    schedule 17.11.2015
comment
Разбейте выражение на регулярную итерацию цикла (не понимание) и попробуйте напечатать r перед выполнением r[0]. Я предполагаю, что это виновник. Я сам не вижу такой проблемы, возможно, это связано с содержимым вашего входного файла.   -  person Paul Rooney    schedule 17.11.2015
comment
@Cyrbil: Бессмысленно использовать DictReader, когда у вас есть только одно поле, а значение, связанное с ним, — это номер строки (который DictReader не заполнит для вас).   -  person ShadowRanger    schedule 17.11.2015
comment
О, еще одно замечание: файлы, открытые для обработки csv в Py3.5, должны открываться с ключевым словом arg newline=''. Вероятно, это не будет иметь значения для вашего ввода, но это единственный способ сделать правильный csv синтаксический анализ.   -  person ShadowRanger    schedule 17.11.2015


Ответы (1)


Есть ли пустые строки в IP.csv?

Ваш код ДЕЙСТВИТЕЛЬНО работал «гладко» на моем компьютере под Python 3.5, но он не работает, если я добавлю пустую строку в начало файла.

Попробуйте добавить print(enum) в свой цикл for, и вы будете знать, что именно приводит к этому исключению.

person xmcp    schedule 17.11.2015