2013-03-01 63 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, '-.'))