Python 将txt文件读入字典

Python 将txt文件读入字典,python,file,dictionary,key,key-value,Python,File,Dictionary,Key,Key Value,我有这样一个文本文件: 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 Re

我有这样一个文本文件:

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文件转换成一个字典,其中每隔一行就是它后面那一行的键。 例如:


你可以用下面的方法得到你想要的

这是怎么回事

enumerate
为每次迭代提供(索引、值)对,您可以使用file对象
f
直接迭代文件中的每一行。通过这种方式,在任何时候都不必将整个文件读入内存(如果这与您有关)

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

如果不需要列表,可以将
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']}
代码

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'}

欢迎来到SO!输出的语法无效,我没有看到任何尝试。你被困在哪里?你的问题是什么?谢谢你的澄清。我只是不知道如何让我的第一排(“本”)成为它下面那排的钥匙等等。我需要文件中的所有名称都是它们下面数值的键。@DylandeHoyos——正如前面提到的,您的输出是无效语法。您希望数字作为1)字符串,即“5 0 0…”还是2)列表,即[5,0,0,…]这些片将在内存中创建列表,不是吗?@python_user--暂时是,但在结果完成时会进行垃圾收集。你想知道这个能处理的最大文件大小吗?是的,只是curious@python_user--事实上,我所说的只是部分正确。切片不会创建列表中对象的副本,只创建对对象的引用。在这种情况下,虽然我们可能有很长的字符串,例如“5 0 0…”,但切片不会创建这些字符串的副本,只会引用它们。
{'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'}