2015-10-28 236 views
0

一條線我有一個這樣的文件:在一個循環從列表打印每個元素的每個循環

1:200-320 ['gene_id "xyz";transcript_id "xyzt"; exon_number "1"\n', 'gene_id "xyz";transcript_id "xyzt2"; exon_number "2"\n'] 
1:3000-3200 ['gene_id "xyz";transcript_id "xy"; exon_number "2"\n'] 

非常凌亂,我希望通過首先分組方面整理一下。即拉出transcript_ids並將其寫爲transcript_id xyzt,xyzt2; 並最終重複所有條款。

我的這種做法是使用

out=open('foo.txt','w') 
with open('in.txt', 'r') as f: 
    for line in f: 
     tidyline = line.replace('[', "").strip() 
     tidyline = tidyline.replace(']', "").strip() 
     tidyline = tidyline.replace('"', "").strip() 
     tidyline = tidyline.replace("'", "").strip() 
     tidyline = tidyline.replace(",", "").strip() 
     out.write("%s\n" %tidyline) 

然後重新使用,以嘗試並匹配字符串和拉回來這個信息代替先刪除所有的雜亂字符。我可以做什麼,只是不知道如何寫入文件,以保持適當的路線。

import re 

with open('foo.txt', 'r') as f: 
    for line in f: 
     result = re.findall('transcript_id\s(\w+)',line)  
     print result 
['xyzt', 'xyzt2'] 
['xy'] 

我的想法是做類似:

string= "transcript_id %s,%s" %(results[0], results[1]) 
file.write("%s\n" %string) 

,但因爲所有的列表中爲每個系列有不同的長度不起作用。

回答

1

您最後的問題(編寫可變長度列表)可以使用字符串的連接方法解決。試試這個:

s = "transcript_id " + ",".join(results) 

要在保存方面有關文件操作你應該出打開文件移動到與語句,以避免保留未關閉的文件:

with open('in.txt', 'r') as f, open('foo.txt','w') as out: 
    ... 

待辦事項你真的需要在寫作foo.txt之間的步驟,還是這只是一個工作?

我希望這會有所幫助。

+0

目前一種解決方法,我將下降這一點。認爲我會更容易跟隨。這正是我正在尋找的,希望可以在我的代碼中早些時候清理整個問題,所以我不會列出清單內的清單(儘管有助於確保我最初做的是我所需要的) – George

0

你可以把所有的結果在一個列表中,然後再通過它:

transcript_id_list = [] 
with open('foo.txt', 'r') as f: 
    for line in f: 
     result = re.findall('transcript_id.*?(\w+)',line) 
     if result: 
      transcript_id_list.extend(result) 

for item in transcript_id_list: 
    string= "transcript_id %s" % item 
    file.write("%s\n" % string)