Pandas:在将文件读入DataFrame时忽略特定字符串后面的所有行

时间:2013-10-02 13:34:57

标签: python pandas

我有一个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需要跳过行数,这可能会在文件之间发生变化。

这里最好的解决方案是什么?我想避免在外部更改文件,除非没有其他解决方案。

2 个答案:

答案 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)