【问题标题】:Importing a txt into a dictionary causes python to crash?将txt导入字典会导致python崩溃?
【发布时间】:2013-02-17 10:43:36
【问题描述】:

我已经关注了这个帖子的第一个答案:

Python - file to dictionary?

每当我尝试运行脚本时,Python 都会关闭。一切,甚至我没有处理的其他脚本。

这是我写的,几乎是一样的:

    d = {}
with open("C:\Users\Owatch\Documents\Python\FunStuff\nsed.txt") as f:
    for line in f:
        (key, val) = line.split()
        d[int(key)] = val

print(d)

我唯一更改的是文件位置,因为这是我理解我要包含的内容,以修复有关找不到文件的错误

阐述:

这是我应该使用的代码:

d = {}
with open("file.txt") as f:
    for line in f:
       (key, val) = line.split()
       d[int(key)] = val

这就是我所做的,添加一个文件路径来代替 file.txt,并让它在完成后立即或应该打印字典 d。

d = {}
with open("C:\Users\Owatch\Documents\Python\Unisung Net Send\nsed.txt") as f:
    for line in f:
        (key, val) = line.split()
        d[int(key)] = val

print(d)

问题是我什至无法运行它,因为 Python 崩溃了,我正在运行版本:3.1

【问题讨论】:

  • 能否详细说明。查看您的代码,您似乎遇到了缩进错误。
  • 您是在 Windows 上运行它吗?如果是这样,“只是崩溃”是指命令窗口再次关闭?
  • 如果是这种情况,请参阅How to stop command prompt from closing in python?
  • 最后但并非最不重要的一点是,您的输入是每行一个空格还是更多?
  • 当您在这种情况下说“崩溃”时,您很可能意味着存在回溯。下次,请在您的问题中包含该追溯。

标签: python dictionary crash


【解决方案1】:

改变

open("C:\Users\Owatch\Documents\Python\FunStuff\nsed.txt")

open(r"C:\Users\Owatch\Documents\Python\FunStuff\nsed.txt")

否则“\nsed”将被视为换行符加上“sed”。

更新:

从您的输入文件中,问题是:

d[int(key)] = val

因为您的第一列是字母,而不是整数。将其更改为:

d[key] = val

或者:(如果你喜欢数字键)

d[ord(key) - ord('a')] = val

【讨论】:

  • 我收到此错误:Traceback(最近一次调用最后一次):文件“C:\Users\Owatch\Documents\Python\FunStuff\File Import”,第 5 行,在 d[int (key)] = val ValueError: int() 以 10 为底的无效文字:'a'
  • 已修复。谢谢,如果你能帮我多一点,并解释一下到底发生了什么?当我不明白正在做什么时,我讨厌它。如果你不想,这一切都很酷。我可能问得有点多。感谢您解决问题
  • 没问题。 int(x) 将字符串或数字 x 转换为整数。由于您的第一列都是字母,因此它没有这样做。如果您不在乎这些数字,只需删除 int。如果您更喜欢数字键,ord 将为您提供字母的整数序数,ord(key) - ord('a') 将为您提供从字母“a”开始的索引。
【解决方案2】:

使用 r'' 原始字符串文字来防止 Python 将 \n 解释为换行符:

with open(r"C:\Users\Owatch\Documents\Python\Unisung Net Send\nsed.txt") as f:

或使用双反斜杠:

with open("C:\\Users\\Owatch\\Documents\\Python\\Unisung Net Send\\nsed.txt") as f:

或改为正斜杠:

with open(r"C:/Users/Owatch/Documents/Python/Unisung Net Send/nsed.txt") as f:

这三个版本在 Windows 上都有效。

【讨论】:

    【解决方案3】:

    将 d[int(key)] 更改为 d[ord(key)]

    【讨论】:

    • 使用 d[ord(key)] 和使用 d[key] = val 有什么区别
    • 如果我希望我的第二列是数字,而不是 ' ' 中的数字,该怎么办?
    • ord('a') 给你 97。这个 97 将被 python 字典 d 中的散列函数考虑,所以它可以作为一个键
    • d[key] 直接借助python的帮助将'a'提供给散列函数,从而'a'作为key。因此,在这种情况下,当引用赋予 ley 'a' 的值时,您将使用 d['a']。在另一种情况下,您将使用 d[ord('a')] 或 d[97]
    • 参考'Hui ZHeng'的答案,d[ord(key) - ord('a')] = val 表示为'a'调用d[0], d[1 ] 代表“b”,类似地 d[25] 代表“z”
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多