2017-08-25 56 views
2

我有一個包含大量數據的文本文件,它看起來是這樣的:Python的解析文本文件的僅特定部分

logstart . . . 
(chunk of data) 
logend . . . 
logstart . . . 
(chunk of data) 
logend . . . 
times 
logstart . . . 
(chunk of data) 
logend . . . 
times 
logstart . . . 
(chunk of data) 
logend . . . 

我希望我的Python代碼來打開文件和讀取的數據塊,如果和只有在它的「logend」下面有與它相關的「時間」。如果這個塊沒有時間,我希望它忽略它。當它讀取正確的數據塊時,我也希望它讀取與之相關的時間。

這是我有什麼之前,我意識到我需要提取僅某些部分(其中保存整個文本文件作爲「行」):我怎樣才能改變這種做法,

lines = [] 
with open(filename, 'rt') as in_file: 
    for line in in_file: 
     lines.append(line) 

「線」現在只是文件的特定部分?

+1

使用正則表達式似乎與're.findall'一起顯示。 – FabienP

+1

請發佈更多信息。日誌塊樣本以及您想要捕獲的內容將有所幫助。 – Solaxun

+0

我正在使用正則表達式來提取我需要的大塊數據內的特定數據(因爲我只需要它的一部分)。但是我目前的問題是讓它只將我的代碼的其餘部分應用於文件的具有與其關聯的特定部分的數據。 –

回答

2

事情是這樣的:

lines = [] 
with open(filename, 'rt') as in_file: 
    chunk = [] 
    for line in in_file: 
     chunk.append(line) 
     if(line.find('times')>=0): 
      lines.extend(chunk) 
     if(line.find('logstart')>=0): 
      chunk = [] 
+0

該解決方案還包含'times','logstart'和'logend'行。 OP不清楚他們是否想要這樣做。 – tdube

+0

另外,您需要使用'True'和'False'。 – tdube

+0

是的,如果它包含這些行是好的,因爲我後來在做正則表達式。但是,這種解決方案不適合我 - 我得到一個AttributeError:'str'對象沒有屬性'contains' –

0

您可以通過保持一個小國家的軌道做到這一點。

lines = [] 
with open(filename, 'rt') as in_file: 
    in_log = False 
    save = [] 
    for line in in_file: 
     if 'logend' in line: 
      in_log = False 
     if in_log: 
      save.append(line) 
     if 'times' in line: 
      save.append(line) 
      lines.extend(save) 
     elif 'logstart' in line: 
      in_log = True 
      save = [] 
+0

謝謝,儘管我遇到了一些問題 - 我認爲這段代碼挑出了低於「時間」的數據塊,但我只想要那些位於「時間」以上的數據塊。我也想讓自己的「時代」也展現出來。 –

+0

@WynneT根據您的反饋更新回答。 – tdube