2012-02-24 38 views
47

这是我目前用来提取与脚本位于同一当前工作目录中的zip文件的代码。我怎样才能指定一个不同的目录来提取?将Python文件内容提取到Python 2.7中的特定目录

我试过的代码并不是在我想要的地方提取它。

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:\\'+移到打开的调用而不是写入调用吗? – 2012-02-24 14:02:37

回答

96

我觉得你刚刚得到了一个查询股价这里。也许应该是类似以下内容:

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:\\") 
+0

ZipFile没有'__exit__'属性,所以我不知道你的声明是如何工作的。 – adam 2015-08-31 18:03:46

+0

如果你创建一个'ZipFile'实例,它确实有'__exit__'方法。我刚刚给了这个例子另一个尝试(python 2.7),它的工作原理如下。 – secretmike 2015-09-02 13:57:16

+0

由于某些原因,Python 2.6有不同的ZipFile实现。 – adam 2015-09-02 16:51:30

2

彼得·德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() 
10

我想在此线程的其他答案,但对我来说,最终的解决办法是简单地:

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

extractall,但只有值得信赖的zip文件中使用它。

+2

我建议调用'zfile.close()',也因为它在[ZipFile.close(https://docs.python.org/2/library/zipfile.html#zipfile说.ZipFile.close)**你必须在退出你的程序之前调用close()或者必要的记录不会被写入**。 – erwaman 2016-04-11 16:47:59

0

我已经修改了代码,要求用户输入文件和路径它需要被提取,因此用户will've在何处放置提取的文件夹和什么样的名字更多的控制应该被分配到提取的文件夹。

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() 
4

添加到secretmike的回答上面的Python 2.6中提取所有文件的支持。

import zipfile 
import contextlib 


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

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

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

看看docs。它还支持压缩和列出内容。

相关问题