-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 に答える