如何从具有多行的文件创建字典

时间:2013-03-18 01:16:30

标签: python-3.x

我正在尝试从文件中的多行创建一个字典,例如。

grocery store
apples
banana
bread

shopping mall
movies
clothing stores
shoe stores

我要做的是将每个部分(即杂货店和购物中心)的第一行设置为键和下面的所有内容(分别是苹果,香蕉,面包和电影,服装店,鞋店) 。我一直在使用readline方法+ while循环,但我无法弄明白。如果有人知道,请帮助。感谢。

3 个答案:

答案 0 :(得分:1)

一种解决方案是在变量中存储布尔值,以确定您是否在某个部分的开头。我不想放弃令人兴奋的(?)结尾,但你可以从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:]

答案 1 :(得分:1)

@minopret已经给出了一个教学上有用的答案,这对初学者来说很重要。从某种意义上说,即使是一些看似复杂的方法也经常在幕后进行 - 使用一种状态机,我的意思是 - 所以知道这一点非常重要。

但是对于它,我将描述一种更高级别的方法。有一个方便的函数itertools.groupby,它将序列分组为连续的组。在这种情况下,我们可以通过一堆并非全为空的行来定义一个组 - 如果该行为空,则bool(line)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}

答案 2 :(得分:0)

from itertools import groupby
with open("shopdict.txt") as fin:
    stripped = map(str.strip, fin)
    d = {k: g for b, (k, *g) in  groupby(stripped, bool) if b}

这是使用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())