2015-01-05 106 views
0

我正在循环访问文本文件test.fasta的行,并且当我到达format1行时,我想要创建一个newFile1,跳过一行,然后编写以下行的fnewFile1,直到我得到的format1另一条线,在这一点上,我想关闭newFile1,创建newfile2当循环创建该文件时关闭文件

我到目前为止有:

import re 

with open('test.fasta', 'r') as seqs: 

    seqFile = (open('throwaway.txt', 'a+')) 

    for line in seqs: 
     if re.search('^>[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]', line): 
      seqFile.close() 
      seqFile = open('%s.fasta' % line, 'a+') 
      seqs.next() 
     else: 
      seqFile.write('%s' % line) 

    seqFile.close() 

此代码的工作,并且输出我期望的。麻烦的是,在我开始循环之前,我需要创建throwaway.txt文件,以便循环的第一次迭代不会失败,因为seqFile不存在。如果我不包含seqFile.close(),那么我只是打开一堆文件。

我可以添加一个if语句,该语句只处理没有文件打开的第一个迭代,但我想知道是否有更好的方法来完成它。

+0

'A +'如果文件未找到,则创建一个新文件。你在想什么? –

+0

我在想我想创建一堆新文件 - 这是按预期工作的。这不是问题,问题是我想在将它们作为循环的一部分完成后关闭这些文件。 – kevbonham

回答

0

对我来说,最直接的方法,以避免依赖于虚拟文件的存在是刚刚赶上第一次通过异常循环当您尝试调用close

if re.search('^>[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]', line): 
    try: 
    seqFile.close() 
    except NameError: # Assuming you haven't set seqFile else where before the first time through the loop 
    pass 
    seqFile = open('%s.fasta' % line, 'a+') 
    # Do everything else you were going to do 
+0

优秀 - 此作品!我最终将'seqFile = None'放在循环外,然后在循环内添加了'if seqFile:seqfile.close()'。你的方式可能最终效率更高......不知道你为什么被拒绝。 – kevbonham

+1

@kevbonham如果有帮助,我很高兴。作为一个侧面说明(如果这种情况还没有出现在你的想法中,但它可能有) - 如果'test.fasta'文件以与该正则表达式不匹配的行开始,那么你将会要么将数据写入一次性文件(以原始版本),要么从该条件的'else'一侧抛出一个未捕获的NameError异常(在此版本中)。 – rchang

+0

是的,好点。这是一个非常具体的用例,文件确实以该正则表达式开始。然而,我仍然很新,希望学习最佳实践 - 您将如何处理第一行可能不匹配的情况? – kevbonham

相关问题