您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何嵌套任意数量的Python文件上下文管理器?

5b51 2022/1/14 8:20:43 python 字数 2677 阅读 465 来源 www.jb51.cc/python

我想采用任意数量的路径来表示嵌套的tar档案,并对最里面的档案执行操作.问题是,嵌套可以是任意的,因此我需要的上下文管理器的数量也是任意的.举个例子:ARCHIVE_PATH = 'path/to/archive.tar' INNER_PATHS = ( 'nested/within/archive/one.tar', 'nested/wi

概述

我想采用任意数量的路径来表示嵌套的tar档案,并对最里面的档案执行操作.问题是,嵌套可以是任意的,因此我需要的上下文管理器的数量也是任意的.

举个例子:

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因为文档在那里说:

…using nested() to open two files is a programming error as the first file will not be closed promptly if an exception is thrown when opening the second file.

有没有办法使用语言结构来执行此操作,还是需要手动管理我自己的打开文件对象堆栈?

ARCHIVE_PATH = "path/to/archive.tar"

INNER_PATHS = [
    "nested/within/archive/one.tar",# Arbitary number of these
]

def list_inner_contents(archive_path,inner_paths):
    def rec(tf,rest_paths):
        if not rest_paths:
            return tf.getnames()

        with TarFile(fileobj=tf.extractfile(rest_paths[0])) as tf2:
            return rec(tf2,rest_paths[1:])

    with TarFile(archive_path) as tf:
        try:
            return rec(tf,inner_paths)
        except RuntimeError:
            # We come here in case the inner_paths list is too long
            # and we go too deeply in the recursion
            return None

总结

以上是编程之家为你收集整理的如何嵌套任意数量的Python文件上下文管理器?全部内容,希望文章能够帮你解决如何嵌套任意数量的Python文件上下文管理器?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶