2016-11-20 58 views
2

我創建了一個函數,我想在整個文件上運行,但我遇到了一些麻煩。我只從文件的最後一行獲取輸出。讀取函數外部的文件以迭代通過

我有兩個不同的輸入的文件和想法是從一個文件以及收集的某些術語採取線,將它們添加到一個字典,然後搜索對應的線的第二文件並打印輸出。我知道這個問題很可能是我爲這個函數調用的位置。

矩陣文件看起來像這樣

 Sp_ds Sp_hs Sp_log Sp_plat 
c3833_g1_i2  4.00 0.07 16.84 26.37 
c4832_g1_i1  24.55 116.87 220.53 28.82 
c5161_g1_i1  107.49 89.39 26.95 698.97 
c4399_g1_i2  27.91 72.57 5.56 36.58 
c5916_g1_i1  82.57 19.03 48.55 258.22 

爆炸文件看起來像這樣

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754 
c1000_g1_i1|m.799  gi|48474761|sp|O94288.1|NOC3_SCHPO  100.00 747  0  0  5  751  1  747  0.0  1506 
c1001_g1_i1|m.800  gi|259016383|sp|O42919.3|RT26A_SCHPO 100.00 268  0  0  1  268  1  268  0.0  557 
c1002_g1_i1|m.801  gi|1723464|sp|Q10302.1|YD49_SCHPO  100.00 646  0  0  1  646  1  646  0.0  1310 
c1003_g1_i1|m.803  gi|74631197|sp|Q6BDR8.1|NSE4_SCHPO  100.00 246  0  0  1  246  1  246  1e-179 502 
c1004_g1_i1|m.804  gi|74676184|sp|O94325.1|PEX5_SCHPO  100.00 598  0  0  1  598  1  598  0.0  1227 
c1005_g1_i1|m.805  gi|9910811|sp|O42832.2|SPB1_SCHPO  100.00 802  0  0  1  802  1  802  0.0  1644 
c1006_g1_i1|m.806  gi|74627042|sp|O94631.1|MRM1_SCHPO  100.00 255  0  0  1  255  47  301  0.0  525 
c1007_g1_i1|m.807  gi|20137702|sp|O74370.1|ISY1_SCHPO  100.00 201  0  0  1  201  1  201  4e-146 412 

,我迄今得到的程序是這樣的

def parse_blast(blast_line="NA"): 
    transcript = blast_line[0][0] 
    swissProt = blast_line[1][3] 
    return(transcript, swissProt) 

blast = open("/scratch/RNASeq/blastp.outfmt6") 
for line in blast: 
     line= [item.split('|') for item in line.split()] 
     (transcript, swissProt) = parse_blast(blast_line = line) 


transcript_to_protein = {} 
transcript_to_protein[transcript] = swissProt 
if transcript in transcript_to_protein: 
     protein = transcript_to_protein.get(transcript) 

matrix = open("/scratch/RNASeq/diffExpr.P1e-3_C2.matrix") 
for line in matrix: 
     matrixFields = line.rstrip("\n").split("\t") 
     transcript = matrixFields[0] 
     Sp_ds = matrixFields[1] 
     Sp_hs = matrixFields[2] 
     Sp_log = matrixFields[3] 
     Sp_plat = matrixFields[4] 

tab = "\t" 
fields = (protein,Sp_ds,Sp_hs,Sp_log,Sp_plat) 
out = open("parsed_blast.txt","w") 
out.write(tab.join(fields)) 
matrix.close() 
blast.close() 
out.close() 

回答

1

這是一個範圍問題,因爲你的縮進不正確。

for line in blast: 
    line= [item.split('|') for item in line.split()] 
    (transcript, swissProt) = parse_blast(blast_line = line) 

因此,你保持循環直到最後一行而不保存你得到的值。 我想你應該你的縮進改變這種

transcript_to_protein = {} # 1. declare the dictionary 

for line in blast: 
     line= [item.split('|') for item in line.split()] 
     (transcript, swissProt) = parse_blast(blast_line = line) 
     transcript_to_protein[transcript] = swissProt # 2. Add the data to the dictionary 

這將解決你的第一個file.But的問題不是你的第二個你不使用你的循環內的字典。

所以,你必須將這些線移動第二環

if transcript in transcript_to_protein: 
    protein = transcript_to_protein.get(transcript) 

我覺得你有這個想法裏面。我會留下剩下的給你做,在循環之前需要移動幾行,在第二個循環之內需要移動一行或兩行。

1

此:

for line in blast: 
     line= [item.split('|') for item in line.split()] 
     (transcript, swissProt) = parse_blast(blast_line = line) 

讀取所有的行,但它完成後(成績單,SWISSPROT)將只從最後一行的值。

同樣爲:

for line in matrix: 
     matrixFields = line.rstrip("\n").split("\t") 
     transcript = matrixFields[0] 
     Sp_ds = matrixFields[1] 
     Sp_hs = matrixFields[2] 
     Sp_log = matrixFields[3] 
     Sp_plat = matrixFields[4] 

你需要把你的行處理其餘的環內。