在Python 2.7中将zip文件内容提取到特定目录

54

这是我目前用来提取与脚本位于同一工作目录中的zip文件的代码。我如何指定不同的目录进行提取?

我尝试过的代码没有将它提取到我想要的位置。

import zipfile

fh = open('test.zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outfile = open(name, 'wb')
    outfile.write('C:\\'+z.read(name))
    outfile.close()
fh.close()

1
你应该将'C:\'移动到open调用中而不是write调用中吗? - Peter de Rivaz
6个回答

113

我认为你搞混了。应该像下面这样:

import zipfile

fh = open('test.zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outpath = "C:\\"
    z.extract(name, outpath)
fh.close()

如果你只想提取所有的文件:

import zipfile

with zipfile.ZipFile('test.zip', "r") as z:
    z.extractall("C:\\")

对于较新的Python版本,请使用pip install zipfile36。

import zipfile36

ZipFile没有属性__exit__,所以我不知道你的with语句怎么能正常工作。 - adam
如果您创建一个ZipFile实例,它确实拥有一个__exit__方法。我刚刚尝试了另一个示例(Python 2.7),并且按照所写的方式运行良好。 - secretmike
Python 2.6由于某些原因在ZipFile的实现上有所不同。 - adam
是的,看文档(https://docs.python.org/2/library/zipfile.html)上说ZipFile只支持作为Python 2.7的上下文管理器 - 我没有尝试过2.6,因为在这种情况下问题指定了Python 2.7。 - secretmike

12

我尝试了这个主题中的其他答案,但对我来说最终的解决方案很简单:

zfile = zipfile.ZipFile('filename.zip')
zfile.extractall(optional_target_folder)

看一下extractall,但仅限于信任的zip文件使用。


2
我建议也调用zfile.close(),因为在ZipFile.close中提到必须在退出程序之前调用close(),否则关键记录将不会被写入。 - erwaman

5

在secretmike的答案基础上添加对Python 2.6的支持,以提取所有文件。

import zipfile
import contextlib


with contextlib.closing(zipfile.ZipFile('test.zip', "r")) as z:
   z.extractall("C:\\")

4

如果你想直接使用Python命令行提取zip文件(比如因为你没有可用的unzip命令),那么可以直接调用zipfile模块。

python -m zipfile -e monty.zip target-dir/

请查看文档。它还支持压缩和列出内容。


2

Peter de Rivaz在上面的评论中有一定道理。你需要在open()方法调用中包含目录。 你需要像这样操作:

import zipfile
import os

os.mkdir('outdir')
fh = open('test.zip','rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outfile = open('outdir'+'/'+name, 'wb')
    outfile.write()
    outfile.close()
fh.close()

0
我已经修改了代码,让用户输入文件名和路径以及需要提取的位置,这样用户就可以更好地控制提取文件夹的位置和名称。
import zipfile

#picking zip file from the directory
ZipFileName = raw_input("Enter full path to zip file:")  
fh = open( ZipFileName , 'rb')
z = zipfile.ZipFile(fh)

#assigning a name to the extracted zip folder
DestZipFolderName = raw_input("Assign destination folder a name: ")
DestPathName = raw_input("Enter destination directory: ")
DestPath = DestPathName + "\\" + DestZipFolderName

for name in z.namelist():   
    outpath = DestPath
    z.extract(name, outpath)
fh.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接