1

我有一个 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],它是可变的(不同的长度)。标头始终具有相同的长度,因此可以使用skiprowsfrom 。pandas.read_csv但是,skipfooter需要跳过的行数,这可以在文件之间改变。

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

4

2 回答 2

5

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)
于 2013-10-04T17:00:40.287 回答
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)
于 2013-10-02T15:42:52.560 回答