我有一个pandas DataFrame,可以概括为:
[Header]
Some_info = some_info
[Data]
Col1 Col2
0.532 Point
0.234 Point
0.123 Point
1.455 Square
14.64 Square
[Other data]
Other1 Other2
Test1 PASS
Test2 FAIL
我的目标是只读取[Data]
和[Other data]
之间的文本部分,该部分是可变的(不同长度)。标头的长度始终相同,因此可以使用skiprows
中的pandas.read_csv
。但是,skipfooter
需要跳过行数,这可能会在文件之间发生变化。
这里最好的解决方案是什么?我想避免在外部更改文件,除非没有其他解决方案。
答案 0 :(得分:4)
Numpy的genfromtxt能够将生成器作为输入(而不是直接放在文件中) - 生成器只要碰到你的页脚就可以停止屈服。生成的结构化数组可以转换为pandas DataFrame。它并不理想,但它看起来并不像pandas的read_csv可以直接使用发生器。
import numpy as np
import pandas as pd
def skip_variable_footer(infile):
for line in infile:
if line.startswith('[Other data]'):
raise StopIteration
else:
yield line
with open(filename, 'r') as infile:
data = np.genfromtxt(skip_variable_footer(infile), delimiter=',', names=True, dtype=None)
df = pd.DataFrame(data)
答案 1 :(得分:2)
此方法必须在文件上运行两次。
import itertools as it
def get_footer(file_):
with open(file_) as f:
g = it.dropwhile(lambda x: x != '[Other data]\n', f)
footer_len = len([i for i, _ in enumerate(g)])
return footer_len
footer_len = get_footer('file.txt')
df = pd.read_csv('file.txt', … skipfooter=footer_len)