#python #python-3.x #dictionary #text-files #valueerror
#python #python-3.x #словарь #текстовые файлы #ошибка значения
Вопрос:
У меня есть текстовый файл, похожий на этот:
banana
delicious
yellow
watermelon
big
red
orange
juicy
vitamin c
И я пытаюсь преобразовать этот текстовый файл в словарь (названия фруктов в качестве ключа и несколько строк описания в качестве различных значений). Ниже приведен мой текущий код.
f = open("filepath", 'w')
myplant = {}
for line in f:
k, v = line.strip().split('nn')
myplant[k.strip()] = v.strip()
f.close()
Но я получил следующую ошибку:
ValueError: not enough values to unpack (expected 2, got 1)
Кто-нибудь может помочь мне отладить мою проблему. Спасибо!
Ответ №1:
- Кратчайшее решение (до того, как вопрос был отредактирован):
myplant = dict((i[0], i[1:3]) for i in (line.strip().split('\n') for line in f if line != 'n') if i)
print(myplant)
Вывод:
{'banana ': [' delicious ', ' yellow '],
'watermelon ': [' big ', ' red '],
'orange ': [' juicy ', ' vitamin c ']}
- Универсальное решение:
Мы можем получить все значения до новой строки n
и сохранить их во временном списке. Затем сохраните его в списке данных.
temporary = []
for line in f:
if line.strip().split('\n')[0]:
if len(line.strip().split('\n')) > 2:
temporary = list(i.strip() for i in line.strip().split('\n') if i.strip())
else:
temporary.append(line.strip().split('\n')[0])
elif temporary:
data.append(temporary)
temporary = []
Результатом будет:
[['banana', 'delicious', 'yellow'],
['watermelon', 'big', 'red'],
['orange', 'juicy', 'vitamin c']]
Теперь для каждого списка первым элементом будет ключ, а остальные — значения.
myplant = dict((val[0], val[1:]) for val in data)
Вывод:
{'banana': ['delicious', 'yellow'],
'watermelon': ['big', 'red'],
'orange': ['juicy', 'vitamin c']}
- Подробное объяснение:
Вы должны использовать r
при чтении из текстового файла
f = open("filepath", 'r')
Кортеж ключ-значение используется при возврате элементов словаря.
k = line.strip().split('\n')
Вы могли бы использовать k.remove("")
для удаления пустых строк.
-
Долгий путь:
while "" in k: k.remove("")
-
Короткий способ:
k = [i for i in k if i]
-
Вывод:
{'banana ': [' delicious ', ' yellow '],
'watermelon ': [' big ', ' red '],
'orange ': [' juicy ', ' vitamin c ']}
- Код:
f = open("filepath", 'r')
myplant = {}
for line in f:
k = line.strip().split('\n')
# while "" in k:
# k.remove("")
k = [i for i in k if i]
if k:
myplant[k[0]] = k[1:]
print(myplant)
f.close()
Ответ №2:
Когда вы выполняете итерацию f
, вы выполняете итерацию по строкам, разделенным 'n'
, поэтому в одной строке * никогда не будет 'nn'
только одной, поэтому .split('nn')
никогда не будет иметь значения two, потому что в 'nn'
line
нет вхождения. Это источник вашей ошибки.
Ниже приведен «симпатичный» способ решения этой проблемы. Я рекомендую вам самостоятельно найти другой подход.
In [1]: !cat filepath.txt
banana
delicious
yellow
watermelon
big
red
orange
juicy
vitamin c
In [2]: import itertools
In [3]: result = {}
...: with open('filepath.txt') as f:
...: for empty_line, group in itertools.groupby(f, lambda x: x == 'n'):
...: if empty_line:
...: continue
...: fruit, *desc = map(str.strip, group)
...: result[fruit] = desc
...:
In [4]: result
Out[4]:
{'banana': ['delicious', 'yellow'],
'watermelon': ['big', 'red'],
'orange': ['juicy', 'vitamin c']}
Ответ №3:
Ну, вы открыли файл в «w», который является режимом записи для того же самого. Что вызывает проблему в цикле for. Вы должны использовать ‘r’ при выполнении операций только для чтения.