2013-07-11 80 views
2

我試圖解析的文本文件看起來像這樣利用大熊貓非普通文本文件:解析在熊貓

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

您不需要regex來匹配以「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_tableread_csvdelim_whitespace=True說法改爲「regular.txt」。

+0

這是怎麼回事,因爲我與數十個目錄打開成千上萬的文件是一個很大的速度問題數以千計的文件。如果可能的話,我想避免中介寫作和閱讀。我很想知道我目前的實施比這個更快。 – deltap

+1

如果你要讀取數以萬計的文件,你可以做的最快的事情就是對每個文件進行一次預處理,並將其轉換爲可以輕鬆閱讀的常規格式。試圖實際上每次解析不規則文件比試圖將其轉換爲有效可讀形式的效率要低。 – BrenBarn

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 

發電機照顧你的內存和處理器時間消耗

/對不起我的英語/