После работы над моим прототипом я все еще пытаюсь сравнить два файла 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)
Это правильно?
csv
находит пустую строку в конце входного файла. Не уверен, почему это повлияет только на 3.5, но я бы убедился, что файл не заканчивается пустой строкой, и/или отфильтровал вывод, изменив инициализациюmaster_indices
наmaster_indices = {r[0]: i for i, r in enumerate(enum) if r}
, чтобы исключить пустые строки. - person ShadowRanger   schedule 17.11.2015r
перед выполнениемr[0]
. Я предполагаю, что это виновник. Я сам не вижу такой проблемы, возможно, это связано с содержимым вашего входного файла. - person Paul Rooney   schedule 17.11.2015DictReader
, когда у вас есть только одно поле, а значение, связанное с ним, — это номер строки (которыйDictReader
не заполнит для вас). - person ShadowRanger   schedule 17.11.2015csv
в Py3.5, должны открываться с ключевым словом argnewline=''
. Вероятно, это не будет иметь значения для вашего ввода, но это единственный способ сделать правильныйcsv
синтаксический анализ. - person ShadowRanger   schedule 17.11.2015