2012-10-14 22 views
26

是否有一个简单的Python功能,将允许解压的.zip文件,像这样?:如何在所有操作系统上使用Python解压缩文件?

unzip(ZipSource, DestinationDirectory) 

我需要的解决方案,采取同样在Windows,Mac和Linux:总是产生一个文件,如果拉链是一个文件,目录如果zip是一个目录,并且目录如果zip是多个文件;总是在里面,而不是在给定的目的地目录

如何在Python中解压文件?

回答

44

使用zipfile模块中的标准库:

import zipfile,os.path 
def unzip(source_filename, dest_dir): 
    with zipfile.ZipFile(source_filename) as zf: 
     for member in zf.infolist(): 
      # Path traversal defense copied from 
      # http://hg.python.org/cpython/file/tip/Lib/http/server.py#l789 
      words = member.filename.split('/') 
      path = dest_dir 
      for word in words[:-1]: 
       while True: 
        drive, word = os.path.splitdrive(word) 
        head, word = os.path.split(word) 
        if not drive: 
         break 
       if word in (os.curdir, os.pardir, ''): 
        continue 
       path = os.path.join(path, word) 
      zf.extract(member, path) 

注意,使用extractall将是短了很多,但是这方法确实的Python 2.7.4之前防止path traversal vulnerabilities。如果你可以保证你的代码在最新版本的Python上运行。

+0

会脆弱的zip文件必须专门设立对于一次攻击,还是仅仅是不良习惯的结果? – tkbx

+1

@tkbx:两者都是可能的。例如。与绝对路径名。 –

+0

在这种情况下,extractall()没有这个问题的替代方案是什么?这个问题发生在使用pwd作为/的zip文件时? – tkbx

3

Python 3.x都有使用-e参数,不能是-h ..如:

python -m zipfile -e compressedfile.zip c:\output_folder 

参数如下..

zipfile.py -l zipfile.zip  # Show listing of a zipfile 
zipfile.py -t zipfile.zip  # Test if a zipfile is valid 
zipfile.py -e zipfile.zip target # Extract zipfile into target dir 
zipfile.py -c zipfile.zip src ... # Create zipfile from sources 
相关问题