-2

所以我的问题是,当其中一个在服务器中找不到文件时,我的代码会崩溃。有没有办法在没有找到文件时跳过查找过程并继续循环。下面是我的代码:

fname = '/Volumes/database/interpro/data/'+uniprotID+'.txt'

for index, (start, end) in enumerate(searchPFAM(fname)):
        with open('output_'+uniprotID+'-%s.txt' % index,'w') as fileinput:
            print start, end
            for item in lookup[uniprotID]:
                item, start, end = map(int, (item, start, end)) #make sure that all value is int
                if start <= item <= end:
                    print item
                    result = str(item - start)
                    fileinput.write(">{0} | at position {1} \n".format(uniprotID, result))
                    fileinput.write(''.join(makeList[start-1:end]))
                    break
            else:
                    fileinput.write(">{0} | N/A\n".format(uniprotID))
                    fileinput.write(''.join(makeList[start-1:end]))

4

2 回答 2

11

您需要使用try/except块来处理异常。有关处理异常,请参阅 Python 文档。

在这种情况下,您必须使用 包装open()调用(以及该with块中的所有内容),try并使用 捕获异常except IOError

for ...
    try:
        with open(...
           # do stuff
    except IOError:
        # what to do if file not found, or pass

附加信息

您真正应该做的是将外部for循环的主体拉出到一个函数中。或者也许 , 的主体with变成处理打开文件的函数。无论哪种方式,减少嵌套都会使事情更具可读性,并且更容易进行这样的更改,添加try/ except

实际上,您似乎在每次外for循环迭代都重新打开文件,但文件名永远不会改变 - 您总是重新打开同一个文件。这是故意的吗?如果没有,您可能想重新考虑您的逻辑,并将其移到循环之外。

第三个想法,你得到的例外是什么?是文件未找到 IOError 吗?因为您正在打开文件以进行写入 ( 'w'),所以我不确定您为什么会得到该异常。

于 2012-07-15T22:59:51.047 回答
1
for index, (start, end) in enumerate(searchPFAM(fname)):
    try:
        newname = 'output_'+uniprotID+'-%s.txt' % index
        with open(newname,'w') as fileinput:
            print start, end
            for item in lookup[uniprotID]:
                item, start, end = map(int, (item, start, end)) #make sure that all value is int
                if start <= item <= end:
                    print item
                    result = str(item - start)
                    fileinput.write(">{0} | at position {1} \n".format(uniprotID, result))
                    fileinput.write(''.join(makeList[start-1:end]))
                    break
                else:
                    fileinput.write(">{0} | N/A\n".format(uniprotID))
                    fileinput.write(''.join(makeList[start-1:end]))
    except IOError:
        print 'Couldn't find file %s' % newname
于 2012-07-15T23:04:52.090 回答