在文本文件中以表格形式提取两个字符串之间的所有行

时间:2019-08-08 19:19:48

标签: python regex pandas

我有一个带有多个重复表的文本文件。

类似于以下内容

Header1 header2 header3
number1 number2 number3

end_pattern junk junk junk

header1 header2 header3
number3 number4 number5

end_pattern junk junk junk

我的目标是将标头1之间(不包括end_pattern)之间的所有数据放入列表中,然后将其放入数据帧中。

理想情况下,我不想让标头重复多次,而只让列表包含一组标头及其下的所有数据值。

到目前为止,我已经拼凑了以下代码,

fh=open(input_file,"r").readlines()

newfile=[]
name_list=['Header1']
for line in name_list:
    A = fh[[s for s,name in enumerate(fh) if line in name][0]:]
    B = A[:[e+1 for e,end in enumerate(A) if 'end_pattern' in end][0]]
    newfile.append(B)    

但是,我遇到了一些问题。

  1. 仅复制第一个表。

  2. 它仍然包括带有end_pattern垃圾的行

我想要的输出基本上是

Header1 header2 header3
number1 number2 number3
number4 number5 number6

欢迎任何想法/可能是达到此结果的更好方法。

谢谢您的时间

2 个答案:

答案 0 :(得分:0)

我会亲自使用分区功能:

http://website.loc

答案 1 :(得分:0)

使用itertools groupby,takewhile和filterfalse

import itertools as it
# ...


def is_header(line):
    return line.lower().startswith('header1 header2 header3')


def not_footer(line):
    return not line.startswith('end_pattern')


def doit():
    newfile = []

    with open(input_file, 'r') as f:
        for in_header, group in it.groupby(f, key=is_header):
            if in_header:
                if not newfile:
                    newfile.append(next(group))
            elif newfile:
                possible_rows = it.takewhile(not_footer, group)
                newfile.extend(it.filterfalse(str.isspace, possible_rows))  # no empty lines

    # print out the file contents
    for x in newfile:
        print(x, end='')


if __name__ == '__main__':
    doit()