【问题标题】:Extracting a single file from a zip archive without iterating over the entire name list in Python从 zip 存档中提取单个文件,而无需在 Python 中遍历整个名称列表
【发布时间】:2013-08-02 11:38:46
【问题描述】:

我有一个包含文件夹的 zip 文件,如下所示:

some.zip/
    some_folder/
         some.xml
         ...

我正在使用zipfile 库。 我想要的是只打开 some.xml 文件,但我现在不打开 some_folder 名称。 我的解决方案如下所示:

    def get_xml(zip_file):
        for filename in zip_file.namelist():
            if filename.endswith('some.xml'):
                return zip_file.open(filename)

我想知道除了扫描整个列表之外是否有更好的解决方案。

【问题讨论】:

  • 我在考虑使用 ZipFile.namelist(),但我不想遍历整个列表。
  • 你必须这样做;只有列出所有文件名才能检测到使用的文件夹名称。

标签: python zip zipfile


【解决方案1】:

这将打印test.zip 文件中的目录列表:

from zipfile import ZipFile


with ZipFile('test.zip', 'r') as f:
    directories = [item for item in f.namelist() if item.endswith('/')]
    print directories

如果知道里面只有一个目录,就取第一项:directories[0]

希望对您有所帮助。

【讨论】:

  • 没有以斜线结尾的条目。曾经。因为没有目录条目。
  • @MartijnPieters 这不是真的。 ZipFile 也公开目录条目。对于包含文件 x/yx/z/w 的 ZIP,表达式 [i.filename for i in z.infolist()] 的计算结果为 ['x/', 'x/y', 'x/z/', 'x/z/w']
  • @MartijnPieters 我在发布之前测试了代码 - 它可以工作。
  • 你是对的,我错了。过错。 zip 规范是.. 不清楚这个问题和文件夹条目确实做了。
【解决方案2】:

你想获取包含some.xml的目录吗?

import os
import zipfile

with zipfile.ZipFile('a.zip', 'r') as zf:
    for name in zf.namelist():
        if os.path.basename(name) == 'some.xml':
            print os.path.dirname(name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多