2011-05-21 88 views
0

我遇到了將列表寫入文件的問題。我註釋某些文件,將它們轉換爲某種格式,因此我讀取序列對齊文件,將它們存儲在列表中,進行必要的格式化,然後將它們寫入新文件。問題是,當我的包含序列比對的列表結構正確時,將它們寫入新文件時產生的輸出不正確(它不會複製我的列表結構)。我只包括我的輸出的一部分以及它應該是什麼樣子,因爲列表本身太長而不能發佈。python將一個列表寫入文件不正確

輸出寫入文件:

> 
TRFE_CHICK 

From XALIGN 

MKLILCTVLSLGIAAVCFAAP (seq spans multiple lines) ... 

ADYIKAVSNLRKCS--TSRLLEAC*> (end of sequence, * should be on a newline, followed by > on a newline as well) 

輸出應該被寫爲:

> 

TRFE_CHICK 

From XALIGN 

MKLILCTVLSLGIAAVCFAAP (seq spans many lines) ... 

ADYIKAVSNLRKCS--TSRLLEAC 

* 

> 

它確實在這個misformatting多次。我嘗試過酸洗和取消清單,但是這會進一步造成錯誤。

我的用於產生的列表,並寫入文件的代碼:

new = [] 
for line in alignment1: 
    if line.endswith('*\n'): 
     new.append(line.strip('*\n')) 
     new.append('*') 
    else: 
     new.append(line) 

new1 = [] 
for line in new: 
    if line.startswith('>'): 
     twolines = line[0] + '\n' + line[1:] 
     new1.append(twolines) 
     continue 
    else: 
     new1.append(line) 

for line in new1: 
    alignfile_annot.write(line) 

基本上,以便它的內容對準文件,插入序列的末端和*字符之間的線我已編碼它和也使得ID後跟ID碼總是在新的行上。這是我的列表建立的方式,但不是寫入文件的方式。任何人都知道爲什麼錯誤格式? 道歉的長文,我試圖保持儘可能短,以使我的問題明確 我運行的Python 2.6.5

+2

你能提供樣本輸入嗎?我想你可以用更少的代碼來實現這個結果。 – garnertb 2011-05-21 13:07:44

+0

輸入是一個包含多個序列比對的ASCII文件。輸入如下所示:> TRFE_HUMAN ...一個非常長的序列,然後在一個新行上跟隨*> TRFE_MOUSE ...另一個長序列,然後是*。代碼很長,因爲我需要關注很多格式細節,例如將兩行分割>和TRFE_MOUSE,並將*放在換行符 – Spyros 2011-05-21 13:19:30

回答

3
new.append(line.strip('*\n')) 
new.append('*') 

你行的列表(新行終止每)所以你需要包括\ n作爲兩行,太:

new.append(line[:-2] + "\n") # slice as you just checked line.endswith("*\n") 
new.append("*\n") 

記得帶(或片,因爲我已經改變了它)將刪除換行符,所以分裂在列表中的單個項目將「... * \ n」的值代入「...」和「*」兩項中,實際上會從您所擁有的版本中刪除換行符riginally。

+0

謝謝!我沒有意識到我的代碼是從列表中刪除一個換行符,而不是插入一個換行符並追加* – Spyros 2011-05-21 13:59:26

+0

我可以問一些其他的問題,我試圖寫入文件的輸出包含數字的字符串,例如'48',' 50' 。在腳本中,您通常會使用行連續字符將str(48),\ str(50)寫入爲48 50.如何在寫入文件時重現此操作?我使用延續字符,但它不起作用。我基本上只需要該文件有行(例如)48 50。 – Spyros 2011-05-21 14:23:42

+0

@Spyros:在Python中使用「+」來連接字符串。 – 2011-05-21 14:26:28