Преобразование текстового файла в словарь python

#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’ при выполнении операций только для чтения.