使用python从zip文件中提取内部文件

时间:2017-11-22 16:25:03

标签: python zip unzip

我能够提取内部文件,但它会提取整个链 假设以下文件结构

v a.zip
    v folder1
        v folder2
            > inner.txt

并假设我想将inner.txt提取到某个文件夹target 目前,当我尝试这样做时会发生的事情是我最终将folder1/folder2/inner.txt提取到target。是否可以提取单个文件而不是整个目录链?因此,当target被打开时,内部唯一的内容是inner.txt

编辑:
使用python zip模块解压缩文件并仅将内部文件提取到所需位置。

2 个答案:

答案 0 :(得分:2)

您应该使用 -j 垃圾路径(不要创建目录))修饰符(旧 v5.52 拥有它)。以下是完整列表:[die]: unzip(1) - Linux man page,或者您只需在终端中运行($ {PATH_TO} /)unzip ,它将输出参数列表。

考虑到要在名为 target 的文件夹中提取文件,请使用该命令(您可能需要指定解压缩的路径):

"unzip" -j "a.zip" -d "target" "folder1/folder2/inner.txt"

输出赢取,但对于 Nix ,这是同样的事情):

(py35x64_test) c:\Work\Dev\StackOverflow\q047439536>"unzip" -j "a.zip" -d "target" "folder1/folder2/inner.txt"
Archive:  a.zip
  inflating: target/inner.txt

输出(不含 -j ):

(py35x64_test) c:\Work\Dev\StackOverflow\q047439536>"unzip" "a.zip" -d "target" "folder1/folder2/inner.txt"
Archive:  a.zip
  inflating: target/folder1/folder2/inner.txt

或者,因为你提到了 Python

code.py

import os
from zipfile import ZipFile


def extract_without_folder(arc_name, full_item_name, folder):
    with ZipFile(arc_name) as zf:
        file_data = zf.read(full_item_name)
    with open(os.path.join(folder, os.path.basename(full_item_name)), "wb") as fout:
        fout.write(file_data)


if __name__ == "__main__":
    extract_without_folder("a.zip", "folder1/folder2/inner.txt", "target")

答案 1 :(得分:1)

zip没有与文件系统相同的文件夹结构 - 每个文件的名称都是整个路径。

您将需要使用允许您读取文件内容的方法(例如zipfile.open或zipfile.read),提取您实际想要使用的文件名的一部分,并将文件内容保存到提交自己。