Python 循环创建文件时关闭该文件

Python 循环创建文件时关闭该文件,python,file-handling,Python,File Handling,我在一个文本文件test.fasta的行中循环,当我到达一行format1时,我想创建一行newFile1,跳过一行,然后将以下f行写入newFile1,直到到达另一行format1,此时我要关闭newFile1,创建newfile2等 到目前为止,我所拥有的: import re with open('test.fasta', 'r') as seqs: seqFile = (open('throwaway.txt', 'a+')) for line in seqs:

我在一个文本文件
test.fasta
的行中循环,当我到达一行
format1
时,我想创建一行
newFile1
,跳过一行,然后将以下
f
行写入
newFile1
,直到到达另一行
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
语句,该语句只处理没有打开文件的第一次迭代,但我想知道是否有更优雅的方法来实现它。

对我来说,避免依赖虚拟文件存在的最直接的方法是,在尝试调用
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

a+
如果找不到文件,则创建新文件。你在想什么?我在想我想要创建一堆新的文件-这正是我想要的。这不是问题所在,问题是我希望在循环完成后能够关闭这些文件。太棒了,这很有效!我最后把
seqFile=None
放在循环外,然后在循环内添加
if-seqFile:seqFile.close()
。你的方法最终可能会更有效。。。不知道你为什么被否决。@kevbonham如果有帮助,我很高兴。作为旁注(如果您还没有想到这个场景,但它可能已经出现了)-如果
test.fasta
文件以与正则表达式不匹配的行开头,您将实际将数据写入一次性文件(在原始版本中),或者抛出未捕获的NameError异常(在此版本中)从该条件的
else
端。是的,很好。这是一个非常具体的用例,文件确实是从正则表达式开始的。然而,我在这方面还是很新手,我很想学习最佳实践——在第一行可能不匹配的情况下,您将如何处理?@kevbonham,这在很大程度上取决于您的需求。代码的目的似乎是将一个大文件划分为一组较小的“记录”,这些记录由那些特殊的行标识;如果您的需求是这样的,您可以丢弃可能出现在开头的截断的“记录”,则可以对
seqFile.write
语句应用类似的
try
/
块,但NameError除外。或者,可能存在一个错误日志,您需要将这些孤立行写入其中。这完全取决于你的要求。