如何使用python解析文本文件中的多行?

时间:2017-03-23 07:34:11

标签: python parsing split

我编辑样本

以下是示例textfile.txt

    -------!@#$-------
    text line1
    text line2
    -------!@#$-------
    dummy text dummy test dummy test
    dummy test dummy test dummy test        
    -------!@#$-------
    text line3
    text line4
    -------!@#$-------

我想解析

“文本行1 \ n文本行2”→数组[0]

“文本行3 \ n文本行4”→数组[1]

我应该如何在python中编码?

5 个答案:

答案 0 :(得分:1)

给定一个文件或字符串列表,例如:

>>> sample = '''\
    -------!@#$-------    # line 0 --> 0th in group --> skip
    text line1            # line 1 --> 1st in group --> save in "last"
    text line2            # line 2 --> 2nd in group --> add to "last"
    -------!@#$-------    # line 3 --> 0th in group --> skip
    text line3            # line 4 --> 1st in group --> save in "last"
    text line4            # line 5 --> 2nd in group --> add to "last"
'''.splitlines(keepends=True)

跨多行累积的最简单方法是计算行数并采取不同的操作取决于是否应跳过组中的第0行,组中的第1行应保存在变量中,或者组中的第二行应与保存在变量中的那一行汇总:

>>> array = []
>>> last = ''
>>> for i, line in enumerate(sample):
        if i % 3 == 1:
            last = line
        elif i % 3 == 2:
            line = last + line
            array.append(line)

>>> array
['    text line1\n    text line2\n', '    text line3\n    text line4\n']

答案 1 :(得分:1)

您可以拆分分隔符,然后清理单个数组元素

sample = '''-------!@#$-------
text line1
text line2
-------!@#$-------
text line3
text line4
'''.split('-------!@#$-------')

>> ['', '\ntext line1\ntext line2\n', '\ntext line3\ntext line4\n']

清理看起来像这样

print [x.strip() for x in sample if len(x) > 0]

>> ['text line1\ntext line2', 'text line3\ntext line4']

答案 2 :(得分:0)

这应该为您提供所需的列表给定文件名的行列表

with open('textfile.txt','r') as f:
  lines = f.read()
result=lines.split('-------!@#$-------')

答案 3 :(得分:0)

您可以使用分隔线进行拆分。然后过滤列表中的非空字符串。 使用该结果,删除尾随的新行。

即,

with open('textfile.txt','r') as f:
    print map(str.strip,filter(None,f.read().split('-------!@#$-------')))

对于具有虚拟内容的更新文本文件,您可以使用lambda函数!

with open('textfile.txt','r') as f:
    print map(str.strip,filter(lambda i: i and 'dummy' not in i,f.read().split('-------!@#$-------')))

输出:

['text line1\ntext line2', 'text line3\ntext line4']

希望它有所帮助!

答案 4 :(得分:0)

Python的groupby()函数很适合这样做:

from itertools import groupby

with open('input.txt') as f_input:
    data = [list(g) for k, g in groupby(f_input, lambda x: not x.startswith("-------!@#$-------")) if k]
    data = [''.join(x) for x in data]

print data

给你data持有:

['text line1\ntext line2\n', 'text line3\ntext line4\n']

第一个列表推导读取不以行分隔符开头的文件分组行。这导致data持有:

[['text line1\n', 'text line2\n'], ['text line3\n', 'text line4\n']]

接下来,第二个列表推导用于连接多行。

所以:

data[0] --> 'text line1\ntext line2\n'
data[1] --> 'text line3\ntext line4\n'

要解析包含某些单词的部分,第二个列表理解可以替换为这个:

data = [''.join(x) for x in data if 'dummy test' not in ''.join(x)]