【问题标题】:With Python's 'tarfile', how can I get the top-most directory in a tar archive?使用 Python 的“tarfile”,如何获取 tar 存档中最顶层的目录?
【发布时间】:2012-07-01 10:04:07
【问题描述】:

我想将主题存档上传到 django web 模块,并希望提取存档中最顶层目录的名称以用作主题名称。存档将始终为 tar-gzip 格式,并且始终在顶层只有一个文件夹(尽管其他文件可能与其并行存在),其中包含模板、css、图像等的各种子目录,以任何顺序适合最好的主题。

目前,基于 MegaMark16 中非常有用的代码,我的工具使用以下方法:

f = tarfile.open(fileobj=self.theme_file, mode='r:gz')
self.name = f.getnames()[0]

其中 self.theme_file 是上传文件的完整路径。只要 tarball 中条目的顺序恰好是正确的,这就可以正常工作,但在许多情况下并非如此。我当然可以遍历整个档案并手动检查正确的“名称”特征,但我怀疑有一种更优雅、更快速的方法。有什么建议吗?

【问题讨论】:

    标签: python tar


    【解决方案1】:

    您需要使用一个名为commonprefix 的方法。

    示例代码的效果如下:

    archive = tarfile.open(filepath, mode='r')
    print os.path.commonprefix(archive.getnames())
    

    打印的值将是“存档中的最顶层目录”——或者,您的主题名称。

    编辑:不过,在进一步阅读您的规范后,如果您有 兄弟姐妹 到“最顶层目录”的文件,这种方法可能不会产生您想要的结果,因为公共前缀就是.;这仅在所有文件确实具有您的主题名称的公共前缀时才有效。

    【讨论】:

    • 你想要的是 commonpath,而不是 commonprefix。
    【解决方案2】:

    所有子目录都有一个'/',所以你可以做这样的事情

    self.name = [name for name in f.getnames() if '/' not in name][0] 并使用其他技巧进行优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多