2013-03-01 62 views
2

我是python(使用2.7)的新手,我試圖使用對齊的序列的fasta文件並刪除句點(。)和破折號( - )。我正在嘗試編寫一個循環,以便python遍歷每一行,並且不用任何內容來替換句點和破折號。這是腳本我有(當我運行它,它消除了時間和破折號但留下空格後面):使用python刪除fasta文件中的句點

InFileName = 'myfile.fasta' 
InFile = open(InFileName, 'r') 

OutFileName = 'myfile_nodots.fasta' 
OutFile = open(OutFileName, 'w') 

for Line in InFile: 

    Line=Line.replace('.', "") 

    Line=Line.replace('-', "") 

    Outfile.write(Line) 

InFile.close() 
OutFile.close() 

任何建議,將不勝感激! Jen

+0

你的問題是什麼?你想解決什麼問題? – 2013-03-01 20:16:21

+1

Python中的變量名應該小寫。按大小寫保留大寫字母。 – 2013-03-01 20:18:10

+0

現在我已經刪除了句點和破折號,但並沒有消除留下的空間(我認爲放置替換('。','')將擺脫留下的空間) – Jen 2013-03-01 20:19:38

回答

2

,您可以簡化一下代碼:

import re 
infilename = 'myfile.fasta' 
outfilename = 'myfile_nodots.fasta' 
regex = re.compile("[.-]+")  

with open(infilename, 'r') as infile, open(outfilename, 'w') as outfile: 
    for line in infile: 
     outfile.write(regex.sub("", line)) 

如果您也想刪除遵循一個點或破折號空間,使用不同的正則表達式:

regex = re.compile("[.-]+ *")  
+0

:')我想知道如何使用正則表達式,但不能直接在我的頭上!謝謝! – Jen 2013-03-01 20:25:07

+1

這工作:)雖然正則表達式可能是這樣一個簡單的op有點重量級。嘗試'line.translate(None,'.-')'。 – sjbx 2013-03-02 08:58:57

+0

這段代碼有一個減號,如果標題包含破折號和圓點,它將在那裏刪除它們,所以它應該跳過所有以'>'開頭的行。 – user3224522 2014-05-28 11:50:09

-1

您試過Outfile.write(Line.strip())

+0

不,這隻會取代Outfile.write(Line)部分嗎? – Jen 2013-03-01 20:29:16

+0

這會在寫入之前去除每行的結尾和前導空白,這是不需要的。 – sjbx 2013-03-02 08:57:15

+0

是的,我誤解了這個問題:) -1在這裏是非常準確的。 – 2013-03-02 18:31:17

3

你可以整理您的代碼使用with以確保文件已關閉,並在2.7中使用第二個參數str.translate指定要刪除的字符,因此您的代碼可能是:

with open('myfile.fasta') as fin, open('myfile_nodots.fasta', 'w') as fout: 
    for line in fin: 
     fout.write(line.translate(None, '-.')) 
+0

可能是最神祕和最pythonic解決方案之一。 – sjbx 2013-03-02 09:00:08

1

使用fileinputtranslate快速就地編輯:

import fileinput 

for line in fileinput.input("test.txt", inplace=1): 
    sys.stdout.write(line.translate(None, '-.')) 

而且你問前:是的,它寫入文件,而不是到控制檯:)

0

假設FASTA頭可能也包含破折號或點(即這是相當常見的,

with open('myfile.fasta') as fin: 
    with open('myfile_nodots.fasta', 'w') as fout: 
     for line in fin: 
      if line.startswith('>'): 
       fout.write(line) 
      else: 
       fout.write(line.translate(None, '-.'))