Python 3.x 如何从包含多行的文件创建字典
我正在尝试从文件中的多行创建字典,例如Python 3.x 如何从包含多行的文件创建字典,python-3.x,Python 3.x,我正在尝试从文件中的多行创建字典,例如 grocery store apples banana bread shopping mall movies clothing stores shoe stores 我想做的是让每个部分的第一行(即杂货店和购物中心)成为关键,下面的所有东西(分别是苹果、香蕉、面包和电影、服装店、鞋店)成为价值。我一直在摆弄readline+while循环的方法,但我还没有弄明白。如果有人知道,请帮忙。谢谢。一种解决方案是将布尔值存储在变量中,用于判断您是否位于节的开头
grocery store
apples
banana
bread
shopping mall
movies
clothing stores
shoe stores
我想做的是让每个部分的第一行(即杂货店和购物中心)成为关键,下面的所有东西(分别是苹果、香蕉、面包和电影、服装店、鞋店)成为价值。我一直在摆弄readline+while循环的方法,但我还没有弄明白。如果有人知道,请帮忙。谢谢。一种解决方案是将布尔值存储在变量中,用于判断您是否位于节的开头。我不想透露激动人心的(?)结局,但你可以从
is_first=True
开始
好吧,我想我还是想放弃结局。以下是我的想法,或多或少:
with open(fname) as f:
content = f.readlines()
is_first = True
d = {}
for line in content:
if line == '\n':
is_first = True
elif is_first:
key = line
is_first = False
else:
if key not in d:
d.put(key, '')
d.put(key, d.get(key) + line)
is_first = False
我发现这样规划代码更容易。当然,您也可以在不使用is_first
变量的情况下解决此问题,特别是如果您已经完成了使用is_first
变量的练习。我认为以下是正确的,但我并没有非常小心:
with open(fname) as f:
content = f.readlines()
d = {}
while content:
key, content = content[0], content[1:]
if key != '\n':
value, content = content[0], content[1:]
while value != '\n':
if key not in d:
d.put(key, '')
d.put(key, d.get(key) + value)
value, content = content[0], content[1:]
@米诺普雷特已经给出了一个教学上有用的答案,这对初学者来说很重要。从某种意义上说,甚至一些看起来更复杂的方法也经常在幕后进行——我的意思是,使用一种状态机——所以知道这一点很重要 不过,我将描述一种更高层次的方法。有一个方便的函数
itertools.groupby
,它将序列分组为连续的组。在这种情况下,我们可以通过一组并非全部为空的行来定义一个组--bool(line)
isFalse
如果该行为空,则为True
,否则为空,然后从中构建一个dict
from itertools import groupby
with open("shopdict.txt") as fin:
stripped = map(str.strip, fin)
grouped = (list(g) for k,g in groupby(stripped, bool) if k)
d = {g[0]: g[1:] for g in grouped}
这里有一种方法就是使用进行循环
d={}
with open("shopdict.txt") as fin:
for key in fin:
key = key.strip()
d[key] = []
for item in fin:
if item.isspace():
break
d[key].append(item.strip())
好吧,那我会做点像。。line=f.readline()line_first=True(或者对每个节的第一行做一个布尔语句?)是的,然后仔细想想:当你不再寻找节的第一行时,你怎么知道?你怎么知道一节什么时候结束,你开始寻找下一节的第一行?首先保持行\u
的相应更新。好吧,我非常困惑,我该如何阅读文件,然后抓住每个部分的第一个单词?当你看输入行并看到它是空的时,你会有什么不同?我应该跳过它。我的意思是,我可以说first_line=file.readline()。。这会给我第一部分的第一行。但是,idk,我在这里不知所措。酷,我也要学习。这说明了为什么Python文档提到库引用时会说“把它放在枕头下”,不是吗?了解图书馆,甚至何时阅读图书馆,都可以节省大量的精力。(其他有帮助的事情:交一些聪明的朋友,学习Haskell,获得计算机科学博士学位,等等!)Python3有一个漂亮的方法来写最后一行d={k:g代表k,*g在grouped}
中使用for
循环实际上比while
更容易<当您到达文件末尾时,for
将自动退出
d={}
with open("shopdict.txt") as fin:
for key in fin:
key = key.strip()
d[key] = []
for item in fin:
if item.isspace():
break
d[key].append(item.strip())