В исходном коде вы читаете все строки в файле за один раз, используя f.readlines()
, а затем разбиваете каждую строку.Проблема в том, что не каждая строка дает вам список с двумя элементами, поэтому key, val = line.split()
дает вам values to unpack
, поскольку вы пытаетесь назначить один список элементов двум элементам.например, a,b = [2]
, что приведет к этой ошибке следующим образом.
In [66]: a,b = [2]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-66-f9f79b7d1d3c> in <module>
----> 1 a,b = [2]
ValueError: not enough values to unpack (expected 2, got 1)
Чтобы избежать этого, мы просто перебираем строки, которые читаем, и каждый четный элемент является ключом, а каждый нечетный элемент - значением всловарь.
dct = {}
with open("file.txt", 'r') as f:
l = f.readlines()
idx = 0
while idx < len(l):
#Even element is key, Odd element is value
key = l[idx].strip()
value = l[idx+1].strip()
dct[key] = value
idx+=2
#{'English': 'hello bye', 'italian': 'ciao hola', 'spanish': 'hola chao'}
Или более кратким решением с использованием dict-понимания является
l = []
with open("file.txt", 'r') as f:
l = f.readlines()
#This will be a list of tuples, with the first element of tuple being the key #and second value being the value
#Keys are obtained by slicing all even indexes, and values by slicing all odd indexes
key_value_tups = zip(l[::2], l[1::2])
#[('English \n', 'hello bye \n'), ('italian \n', 'ciao hola\n'), ('spanish\n', 'hola chao\n')]
#Iterate through the tuples and create the dict via dict-comprehension
dct = {key.strip() : value.strip() for key, value in key_value_tups}
print(dct)
#{'English': 'hello bye', 'italian': 'ciao hola', 'spanish': 'hola chao'}