【发布时间】:2016-02-18 17:32:29
【问题描述】:
在我的prototype 工作之后,我仍在尝试比较两个 CSV 文件。 这次我用的是字典。
我的第一个文件是这样的:
IP
192.168.10.1
192.168.10.15
192.168.10.32
单列,包含 IP 地址。
我想检查这些 IP 是否也是另一个名为 epoch.csv 的文件。 如果是,我用 epoch.csv 中的行副本编写一个 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)
对吗?
【问题讨论】:
-
Python 提供了一个DictReader
-
好的,我检查并编辑我的代码
-
这看起来像是
csv在输入文件末尾找到一个空行的症状。不知道为什么它只会影响 3.5,但我会确保文件不会以空行结尾,和/或过滤输出,将master_indices的初始化更改为master_indices = {r[0]: i for i, r in enumerate(enum) if r}以排除空行。 -
将表达式分解为常规循环迭代(不是理解),并在执行
r[0]之前尝试打印r。我想这就是罪魁祸首。我自己没有看到这样的问题,它可能与您的输入文件内容有关。 -
@Cyrbil:当你只有一个字段时使用
DictReader是没有意义的,并且与之关联的值是行号(DictReader不会为你填充) .
标签: python python-2.7 csv dictionary python-3.5