ネストしたtarアーカイブを表す任意の数のパスを取得し、最も内側のアーカイブに対して操作を実行したいとします。問題は、ネストは任意である可能性があるため、必要なコンテキストマネージャの数も任意です。任意の数のPythonファイルコンテキストマネージャをネストできますか?
には、例えば、テイク:巣に任意の数のレベルがある可能性があるため
ARCHIVE_PATH = "path/to/archive.tar"
INNER_PATHS = (
"nested/within/archive/one.tar",
"nested/within/archive/two.tar",
# Arbitary number of these
)
def list_inner_contents(archive_path, inner_paths):
with TarFile(archive_path) as tf1:
with TarFile(fileobj=tf1.extractfile(inner_paths[0])) as tf2:
with TarFile(fileobj=tf2.extractfile(inner_paths[1])) as tf3:
# ...arbitary level of these!
return tfX.getnames()
contents = list_inner_contents(ARCHIVE_PATH, INNER_PATHS))
私はwith
文のnesting syntaxを使用することはできません。ドキュメントがすぐそこに言うので、私はcontextlib.nested
を使用することはできません。
...例外がスローされた場合には、第2を開いたときに最初のファイルを迅速にクローズされませんように2つのファイルを開くには
nested()
を使用すると、プログラミングエラーですファイル。
これを行うには言語構造を使用する方法がありますか、または開いているファイルオブジェクトの独自のスタックを手動で管理する必要がありますか?
は3.3で、あなたは[ 'contextlib.ExitStack'](HTTPを使用することができます。 org/3/library/contextlib.html#contextlib.ExitStack)。 – delnan
@delnan - 私はPython 3を使わないように**依存しています:/ – detly
@delnan Nice!私はこれがpython3.3で追加されたことを知らなかった。本当にきれいな解決策と思われます。 – Bakuriu