如何解决将文本文件转换成字典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','watermelon': ['big','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 ',' 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()
,
当您在f
上进行迭代时,您正在在由'\n'
分隔的行上进行迭代,因此*单行中永远不会存在'\n\n'
.split('\n\n')
永远不会有两个值,因为'\n\n'
中不会出现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','vitamin c']}
,
好吧,您以“ w”打开文件,这是同样的写模式。这会导致for循环出现问题。在执行只读操作时,应使用“ r”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。