ファイルのリストを処理しようとしています。それぞれが通常のテキスト ファイルまたは bz2 アーカイブである可能性があります。
try-except ブロックを最も効率的に使用して、各ファイルを適切な形式で開くにはどうすればよいですか? ファイルの拡張子は常に信頼できるとは限らないため (そしてあまり EAFP ではないため)、ファイルの拡張子をチェックしたくありません。
現在私はやっています:
def data_generator(*corpora):
def parse_lines(fobj):
for line in fobj:
# Do lots of processing.
# ...
# Many lines here omitted.
yield ('lots', 'of', 'data')
for corpus in corpora:
try:
with bz2.BZ2File(corpus, mode='r') as f:
for data in parse_lines(f):
yield data
except IOError:
with codecs.open(corpus, encoding='utf-8') as f:
for data in parse_lines(f):
yield data
繰り返されるfor data in parse_lines(f): ...
コードは不必要に見えると思いますが、それを取り除く方法が思いつきません。以前のものを減らす方法はありますか、またはファイルを「スマートオープン」しようとする別の方法はありますか?
編集:オプションのフォローアップ
チェックするフォーマットの数を増やす適切な方法は何ですか? 例として、プログラム 7zip を使用すると、任意のファイルを右クリックして、アーカイブ (7zip がサポートするもの) として開くことができます。現在の try-except ブロック戦略では、次のようないくつかのフォーマットの後でも、すぐにブロックにネストされ始めるようです。
try:
f = ...
except IOError:
try:
f = ...
except IOError:
try:
...