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)
is
False
如果该行为空,则为
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())