我有一个带有多个重复表的文本文件。
类似于以下内容
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)
但是,我遇到了一些问题。
仅复制第一个表。
它仍然包括带有end_pattern垃圾的行
我想要的输出基本上是
Header1 header2 header3
number1 number2 number3
number4 number5 number6
欢迎任何想法/可能是达到此结果的更好方法。
谢谢您的时间
答案 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()