【问题标题】:dict () - Python 2.7 From 3.5 -dict() - Python 2.7 从 3.5 -
【发布时间】: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


【解决方案1】:

IP.csv中有空行吗?

您的代码确实在我的计算机中在 Python 3.5 下“顺利”运行,但如果我在文件开头添加一个空行,它将失败。

尝试在你的 for 循环中添加print(enum),你就会知道究竟是什么导致了这个异常。

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 2016-01-24
    • 2016-08-19
    • 1970-01-01
    • 2019-09-13
    • 2018-12-24
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多