Python - 在同一分隔符的多个实例之间提取行

时间:2015-03-31 19:12:28

标签: python regex

我有一个像这样的文件

===
aa
bb
===
aa
cc
dd
==
11

我需要提取“===”之间的行并将它们放在不同的变量中(可能是一个列表)。

你能帮帮我吗? 谢谢

2 个答案:

答案 0 :(得分:2)

with open('input.txt') as input_file:
    result = input_file.read().split('===\n')
print result

答案 1 :(得分:2)

您可以使用itertools.groupby===之间的行进行分组,并将它们添加到字典中。

from itertools import groupby,count

with open("in.txt") as f:
    cn = count()
    d = {}
    for k, v in groupby(f, lambda x: not x.startswith("=")):
        if k:
            d[next(cn)] = "".join(v)
{0: 'aa\nbb\n', 1: 'aa\ncc\ndd\n', 2: '11'}

假设每个部分至少有一个=

当我们找到以=开头的行时,使用defaultdict更改密钥:

from collections import defaultdict
from itertools import count

with open("in.txt") as f:
    cn = count()
    d = defaultdict(str)
    for line in f:
        if line.startswith("="):
            key = next(cn)
        else:
             d[key] += line
print(d)
defaultdict(<type 'str'>, {0: 'aa\nbb\n', 1: 'aa\ncc\ndd\n', 2: '11\n'})

无论哪种方式都会避免一次将所有文件读入内存。如果您要删除换行符,请使用line.rstrip

如果您希望每行作为列表中的单个元素:

from itertools import groupby, count

with open("in.txt") as f:
    cn = count()
    d = {}
    for k, v in groupby(f, lambda x: not x.startswith("=")):
        if k:
            d[next(cn)] = list(map(str.rstrip, v)) 

print(d)
{0: ['aa', 'bb'], 1: ['aa', 'cc', 'dd'], 2: ['11']}

最后,如果你想要一个清单列表:

with open("in.txt") as f:
    print [list(map(str.rstrip, v)) for k,v in groupby(f, lambda x: not x.startswith("=")) if k]
    [['aa', 'bb'], ['aa', 'cc', 'dd'], ['11']]