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

如何使用python解析文本文件中的多行?,python,parsing,split,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 -------!@#$

我编辑样本

下面是示例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进行源代码编码?

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

>>> 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行保存在变量中,或是否应将组中的第2行与保存在变量中的行聚合而采取不同的操作:

>>> 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']

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

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']

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

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

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

就是

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']
希望有帮助

Python的函数很适合这样做:

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
给你
数据
持有:

['text line1\ntext line2\n', 'text line3\ntext line4\n']
第一个列表读取不以行分隔符开头的文件分组行。这将导致
数据
保持:

[['text line1\n', 'text line2\n'], ['text line3\n', 'text line4\n']]
接下来,使用第二个列表理解来连接多行

因此:


要解析出包含特定单词的部分,第二个列表理解可以替换为以下内容:

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

与split(内置)相比,使用此方法时的时间复杂度很高!我可以再问一个问题吗?我编辑示例文本文件您不想要的行有什么特别之处?例如,它们总是第二个条目吗?或者它们是否包含您不想要的文本?现在源代码是“虚拟文本虚拟测试虚拟测试\n虚拟文本虚拟测试虚拟测试”→ 数组[1]我不希望我已经更新了脚本,只要使用类似于
data=[''的东西。如果'dummy test'不在''中,那么在数据中为x加入(x)'。加入(x)]
oh good!谢谢,但我的示例文件已被修改,我应该如何处理它?如中所述进行修改?是否必须忽略taht行中的任何特定文本或任何特定模式?
data = [''.join(x) for x in data if 'dummy test' not in ''.join(x)]