【问题标题】:Reading a txt file into a dictionary将txt文件读入字典
【发布时间】:2021-01-27 03:16:36
【问题描述】:

我有一个像这样的文本文件:

Ben
5 0 0 0 0 0 0 1 0 1 -3 5 0 0 0 5 5 0 0 0 0 5 0 0 0 0 0 0 0 0 1 3 0 1 0 -5 0 0 5 5 0 5 5 5 0 5 5 0 0 0 5 5 5 5 -5 
Moose
5 5 0 0 0 0 3 0 0 1 0 5 3 0 5 0 3 3 5 0 0 0 0 0 5 0 0 0 0 0 3 5 0 0 0 0 0 5 -3 0 0 0 5 0 0 0 0 0 0 5 5 0 3 0 0 
Reuven
5 -5 0 0 0 0 -3 -5 0 1 -5 5 0 1 0 1 -3 1 -5 0 0 0 0 0 0 3 0 0 0 0 -5 1 0 1 0 -5 0 3 -3 3 0 1 5 1 0 0 0 0 0 1 3 1 5 1 3 

我需要将此 txt 文件转换为字典,其中每隔一行是其后一行的键。 示例:

d = {'ben': 5 0 0 0 0 0 0 1 0 1 -3 5 0 0 0 5 5 0 0 0 0 5 0 0 0 0 0 0 0 0 1 3 0 1 0 -5 0 0 5 5 0 5 5 5 0 5 5 0 0 0 5 5 5 5 -5, 
"moose":5 5 0 0 0 0 3 0 0 1 0 5 3 0 5 0 3 3 5 0 0 0 0 0 5 0 0 0 0 0 3 5 0 0 0 0 0 5 -3 0 0 0 5 0 0 0 0 0 0 5 5 0 3 0 0, 
"Reuven":5 -5 0 0 0 0 -3 -5 0 1 -5 5 0 1 0 1 -3 1 -5 0 0 0 0 0 0 3 0 0 0 0 -5 1 0 1 0 -5 0 3 -3 3 0 1 5 1 0 0 0 0 0 1 3 1 5 1 3}

【问题讨论】:

  • 欢迎来到 SO!输出不是有效的语法,我没有看到尝试。你在哪里卡住了,你的问题是什么?感谢您的澄清。
  • 我只是对如何让我的第一行(“Ben”)成为它下面的行的键等感到困惑。我需要我文件中的所有名称作为它们下面的数值的键。
  • @DylandeHoyos——如前所述,您的输出语法无效。您是否希望将数字作为 1) 字符串,即 '5 0 0 ...' 或 2) 列表,即 [5, 0, 0, ...]

标签: python file dictionary key key-value


【解决方案1】:

你可以通过以下方式得到你想要的

这是如何工作的

enumerate 为每次迭代提供一个 (index, value) 对,您可以使用文件对象 f 直接遍历文件中的每一行。这样一来,您就不必在任何时候将整个文件读入您​​的内存,如果您担心的话。

i % 2 == 0 表示该行是偶数行,因此将是您字典中的一个键。然后else部分会使用这个key来添加奇数行。

如果您不想在此处列出列表,可以将 line.strip().split() 更改为 line

f = open('file.txt')

res = {}

for i, line in enumerate(f):
    if i % 2 == 0:
        key = line.strip()
    else:
        res[key] = line.strip().split()

print(res)
f.close()

输出

{'Ben': ['5', '0', '0', '0', '0', '0', '0', '1', '0', '1', '-3', '5', '0', '0', '0', '5', '5', '0', '0', '0', '0', '5', '0', '0', '0', '0', '0', '0', '0', '0', '1', '3', '0', '1', '0', '-5', '0', '0', '5', '5', '0', '5', '5', '5', '0', '5', '5', '0', '0', '0', '5', '5', '5', '5', '-5'], 'Moose': ['5', '5', '0', '0', '0', '0', '3', '0', '0', '1', '0', '5', '3', '0', '5', '0', '3', '3', '5', '0', '0', '0', '0', '0', '5', '0', '0', '0', '0', '0', '3', '5', '0', '0', '0', '0', '0', '5', '-3', '0', '0', '0', '5', '0', '0', '0', '0', '0', '0', '5', '5', '0', '3', '0', '0'], 'Reuven': ['5', '-5', '0', '0', '0', '0', '-3', '-5', '0', '1', '-5', '5', '0', '1', '0', '1', '-3', '1', '-5', '0', '0', '0', '0', '0', '0', '3', '0', '0', '0', '0', '-5', '1', '0', '1', '0', '-5', '0', '3', '-3', '3', '0', '1', '5', '1', '0', '0', '0', '0', '0', '1', '3', '1', '5', '1', '3']}

【讨论】:

    【解决方案2】:

    代码

    with open('input.txt', 'r') as infile:
        data = infile.readlines()   # data is a list with lines of file
        # Use slicing and zip with dictionary comprehension
        # data[::2] are even lines of data
        # data[1::2] are odd lines of data
        # use rstrip to get rid of trailing '\n'
        result = {x.rstrip():y.rstrip() for x, y in zip(data[0::2], data[1::2])}
    

    结果包含

    {'Ben': '5 0 0 0 0 0 0 1 0 1 -3 5 0 0 0 5 5 0 0 0 0 5 0 0 0 0 0 0 0 0 1 3 0 1 0 -5 0 0 5 5 0 5 5 5 0 5 5 0 0 0 5 5 5 5 -5',
     'Moose': '5 5 0 0 0 0 3 0 0 1 0 5 3 0 5 0 3 3 5 0 0 0 0 0 5 0 0 0 0 0 3 5 0 0 0 0 0 5 -3 0 0 0 5 0 0 0 0 0 0 5 5 0 3 0 0',
     'Reuven': '5 -5 0 0 0 0 -3 -5 0 1 -5 5 0 1 0 1 -3 1 -5 0 0 0 0 0 0 3 0 0 0 0 -5 1 0 1 0 -5 0 3 -3 3 0 1 5 1 0 0 0 0 0 1 3 1 5 1 3'}
    

    【讨论】:

    • 那些切片会在内存中创建列表,不是吗?
    • @python_user--暂时是,但在结果完成时会收集垃圾。您想知道它可以处理的最大文件大小吗?
    • 是的,只是好奇
    • @python_user——实际上我所说的只是部分正确。切片不会创建列表中对象的副本,只是对对象的引用。 S 在这种情况下,虽然我们可能有很长的字符串,即 '5 0 0 ...',但切片不会创建这些字符串的副本,只是对它们的引用。
    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2010-09-25
    • 2021-03-06
    相关资源
    最近更新 更多