【问题标题】:How to copy a file in a zipfile into a certain directory?如何将zipfile中的文件复制到某个目录?
【发布时间】:2016-07-02 21:07:06
【问题描述】:

我只需要500个zipfile中的一个子文件,路径是一样的,比如:

120132.zip/A/B/C/target_file
212332.zip/A/B/C/target_file
....

如何将所有这些目标文件复制到一个目录中?将整个路径保留在新目录中将是最好的,我的意思是:

target_dir/
    120132/A/B/C/target_file
    212332/A/B/C/target_file
    ......

我用 Python 模块 zipfileshutil 尝试过

但是,shutil 中的 copyfile 将整个路径作为参数,但是当我尝试直接复制目标文件时,它会引发 filenotfind 错误。使用 zipfile.Zipfile 解压后,目标文件可以访问,但 copyfile 无效。

我怎样才能正确有效地做到这一点?

【问题讨论】:

    标签: python zip


    【解决方案1】:

    ZipFile.extract 接受可选的path 指定它将提取文件到哪个目录:

    import os
    import zipfile
    
    zip_filepath = ['120132.zip', '212332.zip', ...]  # or glob.glob('...zip')
    target_dir = '/path/to/target_dir'
    
    for path in zip_filepath:
        with zipfile.ZipFile(path) as zf:
            dirname = os.path.join(
                target_dir, os.path.splitext(os.path.basename(path))[0]
            )
            zf.extract('A/B/C/target_file', path=dirname)
    

    【讨论】:

    • 是的!这完全是我想要的! extract() 是有道理的。谢谢!
    • 我遇到了另一个问题。我在 Windows 上执行了 "zf.extract(r"A\B\C\filename", ..)",但它失败了,说“没有名为 'A\\\\B\\\\C\\ 的项目\\文件名'”。你能给我一个建议吗? @falsetru
    • @Spike,您确定所有 zip 文件都包含该文件吗?它从一开始的文件就失败了吗?您可能需要在致电extract 或使用try ... except ... 之前检查它。
    • 哦,对不起,我犯了一个错误,不过,谢谢! @falsetru
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2015-05-05
    相关资源
    最近更新 更多