将文本文件转换为字典 python
Converting text file into dictionary python
我有一个与此类似的文本文件:
banana
delicious
yellow
watermelon
big
red
orange
juicy
vitamin c
我正在尝试将此文本文件转换为字典(水果名称作为键,几行描述作为各种值)。以下是我当前的代码。
f = open("filepath", 'w')
myplant = {}
for line in f:
k, v = line.strip().split('\n\n')
myplant[k.strip()] = v.strip()
f.close()
但是我得到了以下错误:
ValueError: not enough values to unpack (expected 2, got 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()
好吧,您在“w”中打开了文件,这是相同的写入模式。这导致了 for 循环中的问题。执行 read-only 操作时应使用 'r'。
当您遍历 f
时,您是在 遍历由 '\n'
分隔的行,因此*永远不会有 '\n\n'
一行,只有一行,所以 .split('\n\n')
永远不会有两个值,因为 line
中没有出现 '\n\n'
。那是你错误的根源。
以下是解决这个问题的“可爱”方法。不过,我鼓励您自己想出另一种方法。
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']}
我有一个与此类似的文本文件:
banana
delicious
yellow
watermelon
big
red
orange
juicy
vitamin c
我正在尝试将此文本文件转换为字典(水果名称作为键,几行描述作为各种值)。以下是我当前的代码。
f = open("filepath", 'w')
myplant = {}
for line in f:
k, v = line.strip().split('\n\n')
myplant[k.strip()] = v.strip()
f.close()
但是我得到了以下错误:
ValueError: not enough values to unpack (expected 2, got 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()
好吧,您在“w”中打开了文件,这是相同的写入模式。这导致了 for 循环中的问题。执行 read-only 操作时应使用 'r'。
当您遍历 f
时,您是在 遍历由 '\n'
分隔的行,因此*永远不会有 '\n\n'
一行,只有一行,所以 .split('\n\n')
永远不会有两个值,因为 line
中没有出现 '\n\n'
。那是你错误的根源。
以下是解决这个问题的“可爱”方法。不过,我鼓励您自己想出另一种方法。
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']}