2017-10-20 111 views
-1

我正在編寫一個逐行讀取大型文本文件的代碼,並找到以UNIQUE-ID(文件中有許多文件)開頭的行,它正好在某些行(在本例中,以'REACTION-LAYOUT - '開始並且字符串中的第5個元素爲OLEANDOMYCIN)。代碼如下:Python在文本文件中提取特定行

data2 = open('pathways.dat', 'r', errors = 'ignore') 

pathways = data2.readlines() 

PWY_ID = [] 
line_cont = [] 
L_PRMR = [] #Left primary 
car = [] 

#i is the line number (first element of enumerate), 
#while line is the line content (2nd elem of enumerate) 

for i,line in enumerate(pathways): 
    if 'UNIQUE-ID' in line: 
     line_cont = line 
     PWY_ID_line = line_cont.rstrip() 
     PWY_ID_line = PWY_ID_line.split(' ') 
     PWY_ID.append(PWY_ID_line[2]) 
    elif 'REACTION-LAYOUT -' in line: 
     L_PWY = line.rstrip() 
     L_PWY = L_PWY.split(' ') 
     L_PRMR.append(L_PWY[4]) 
    elif 'OLEANDOMYCIN' in line: 
     car.append(PWY_ID) 
print(car) 

但是,輸出是不是所有包含PWY_ID(第一if語句的輸出),就像是忽略了代碼的所有其餘的行。任何人都可以幫忙嗎?

編輯


下面是我的數據樣本(也有像我的文本文件1000-ISH類似的 「頁面」):

// 
UNIQUE-ID - PWY-741 
. 
. 
. 
. 
PREDECESSORS - (RXN-663 RXN-662) 
REACTION-LAYOUT - (RXN-663 (:LEFT-PRIMARIES CPD-1003) (:DIRECTION :L2R) (:RIGHT-PRIMARIES CPD-1004)) 
REACTION-LAYOUT - (RXN-662 (:LEFT-PRIMARIES CPD-1002) (:DIRECTION :L2R) (:RIGHT-PRIMARIES CPD-1003)) 
REACTION-LAYOUT - (RXN-661 (:LEFT-PRIMARIES CPD-1001) (:DIRECTION :L2R) (:RIGHT-PRIMARIES CPD-1002)) 
REACTION-LIST - RXN-663 
REACTION-LIST - RXN-662 
REACTION-LIST - RXN-661 
SPECIES - TAX-351746 
SPECIES - TAX-644631 
SPECIES - ORG-6335 
SUPER-PATHWAYS - PWY-5266 
TAXONOMIC-RANGE - TAX-1224 
// 
+0

你能從你的文本文件發表幾行嗎? – anupsabraham

+0

你可以舉一些例子數據 – Matt

+1

不知道我是否理解這個問題;你是否正在尋找一個特定的行,在這三個條件都是真的?所以有'獨特ID','REACTION-LAYOUT - '和'OLEANDOMYCIN'的線? –

回答

1

我認爲這會有幫助,如果你張貼了一些數據的例子。但是,一個近似,你要尋找的是:

with open('pathways.dat','r', errors='ignore') as infile: 
    i = infile.read().find(string_to_search) 
    infile.seek(i+number_of_chars_to_read) 

我希望這段代碼可以幫助你專注於你的腳本在這條線上。

+0

我不明白這段代碼,你能解釋一下它的作用嗎? – StudentOIST

+0

第一行以讀取模式打開文件。 第二行讀取WHOLE文件並搜索最後一個字符串作爲參數。這會導致變量i存儲找到該字符串的第一個字符的索引。因此,通過這個索引並且知道要讀取的字符數,就是我們在第三行中恢復的內容。 例如,假定輸入文件有下面幾行: RIO 789 CAR 943 BAG 134 繼續在明年發表評論! –

+0

在第二行中,infile.read()的部分將完整地讀取它,也就是說在這種情況下的三行,並且在此查找我們傳遞給它的鏈,假設我們查找CAR。這將在變量i中保存第一次出現的字符串CAR開始的索引。例如,如果在第三行中,我們使number_of_chars_to_read爲7,那麼第三行返回的是「CAR 943」。 我希望通過這個小例子來指導和幫助你解決問題。 你給我的任何其他澄清,我會幫你。 –

0

print(car)是打印出所有的列表在第一個行中加上PWD_ID.append(PWY_ID_line[2])的行,因爲當您執行car.append(PWY_ID)時,您將PWD_ID的整個列表追加到car。 所以,如果你想打印出與OLEANDOMYCIN行的列表,你可能只想做car.append(行)。

相關問題