2

我正在尝试使用 pandas 解析一个看起来像这样的文本文件:

Some random text
more random text that may be of different length
JUNK 0 9 8
GOOD 0 1 1
GOOD 5 5 5
more random text interdispersed
GOOD 123 321 2
JUNK 55 1 9
GOOD 1 2 3

该文件以空格分隔。我只关心以“GOOD”开头的行,它们都具有相同的格式。

我相信这read_table()是正确的命令,但我不知道如何过滤它。

我目前解析文件的方法是打开文件,使用正则表达式匹配我关心的行,然后将行拆分为空格。这可能很慢,我正在寻找一种更快更清洁的方法。

4

2 回答 2

4

您不需要正则表达式来匹配以“GOOD”开头的行。只需遍历文件并丢弃所有其他行,创建所需数据的“干净”副本:

with open('irregular.txt') as inFile, open('regular.txt', 'w') as outFile:
    for line in inFile:
        if line.startswith('GOOD'):
            outFile.write(line)

read_table然后,您可以使用或read_csv与参数一起阅读“regular.txt” delim_whitespace=True

于 2013-07-11T18:15:26.353 回答
2

让我们制作一个过滤好线条的生成器

def generate_good_lines(filename):
    with open(filename) as f:
        if line.startswith('GOOD'):
            yield line

现在您只需要以您想要的方式解析这些行,例如:

def generate_parsed(filename_list):
    for filename in filename_list:
        for line in generate_good_lines(filename)
            data = your_parser_function(line)
            yield data

然后您将所有行都消耗到列表中(例如):

your_list = list(generate_parsed(your_filename_list))

在您的问题中,您的_parser_function 看起来像这样:

def your_parser_function(line):
    return map(int, line[5:].split()) # split values and convert them to integers

生成器会关心您的内存和处理器时间消耗

/ 对不起我的英语不好 /

于 2013-07-11T21:03:24.833 回答