Home  >  Article  >  Backend Development  >  How to compress and decompress ZIP files in Python

How to compress and decompress ZIP files in Python

黄舟
黄舟Original
2017-10-04 09:26:051564browse

This article mainly introduces the method of compressing and decompressing ZIP files in Python. It analyzes the common operating techniques of compressing and decompressing zip files in Python based on specific examples. Friends in need can refer to the following

The example in this article describes how to compress and decompress ZIP files in Python. Share it with everyone for your reference, the details are as follows:

Sometimes we need to use zip files in Python, and in version 1.6, Python already provides the zipfile module to perform such operations. However, the zipfile module in Python cannot handle multi-volume situations, but this situation is rare, so it is enough for normal use. Below I just recorded some basic zipfile operations, which is enough to handle most situations.

The zipfile module allows you to open or write a zip file. For example:


import zipfile
z = zipfile.ZipFile('zipfilename', mode='r')

This opens a zip file. If the mode is 'w' or 'a', it means that a zip file is to be written. If it is writing, you can also follow the third parameter:

compression=zipfile.ZIP_DEFLATED or compression=zipfile.ZIP_STORED ZIP_DEFLATED is the compression flag. If you use it, you need to compile the zlib module. The latter one is just packed with zip and not compressed.

After opening the zip file, you can read the contents of the zip file or save the contents to the zip file according to your needs.

Read the contents of the zip

It is very simple. The zipfile object provides a read(name) method. name is a file entry in the zip file. After the execution is completed, the read content will be returned. You can save it to the file you want.

Write zip file

There are two ways, one is to write directly to an existing file, the other is to write a string.

For the first write(filename, arcname, compress_type) using zipfile object, the last two parameters can be ignored. The first parameter is the file name, and the second parameter is the name in the zip file. If not given, the same name as filename is used. compress_type is a compression flag that overrides the parameters when creating a zipfile. The second method is to use writestr(zinfo_or_arcname, bytes) of the zipfile object. The first parameter is the zipinfo object or the compression name written to the compressed file, and the second parameter is a string. Use this method to dynamically organize the contents of the file.

It should be noted that when reading, because only the content can be read, if you want to expand the zip file according to the directory structure, these operations need to be completed by yourself, such as creating a directory, creating a file and writing . When writing, the directory structure in the zip file can be dynamically organized as needed, so that the zip file can be generated without following the original directory structure.

So for the convenience of use, I created my own ZFile class, which mainly implements the compress to function in the right-click menu of winrar - that is, compresses a zip file to a specified directory and automatically creates the corresponding subfolder. Table of contents. Another is the convenience of generating zip files. The class source code is:


# coding:cp936
# Zfile.py
# xxteach.com
import zipfile
import os.path
import os
class ZFile(object):
  def __init__(self, filename, mode='r', basedir=''):
    self.filename = filename
    self.mode = mode
    if self.mode in ('w', 'a'):
      self.zfile = zipfile.ZipFile(filename, self.mode, compression=zipfile.ZIP_DEFLATED)
    else:
      self.zfile = zipfile.ZipFile(filename, self.mode)
    self.basedir = basedir
    if not self.basedir:
      self.basedir = os.path.dirname(filename)
  def addfile(self, path, arcname=None):
    path = path.replace('//', '/')
    if not arcname:
      if path.startswith(self.basedir):
        arcname = path[len(self.basedir):]
      else:
        arcname = ''
    self.zfile.write(path, arcname)
  def addfiles(self, paths):
    for path in paths:
      if isinstance(path, tuple):
        self.addfile(*path)
      else:
        self.addfile(path)
  def close(self):
    self.zfile.close()
  def extract_to(self, path):
    for p in self.zfile.namelist():
      self.extract(p, path)
  def extract(self, filename, path):
    if not filename.endswith('/'):
      f = os.path.join(path, filename)
      dir = os.path.dirname(f)
      if not os.path.exists(dir):
        os.makedirs(dir)
      file(f, 'wb').write(self.zfile.read(filename))
def create(zfile, files):
  z = ZFile(zfile, 'w')
  z.addfiles(files)
  z.close()
def extract(zfile, path):
  z = ZFile(zfile)
  z.extract_to(path)
  z.close()

The above is the detailed content of How to compress and decompress ZIP files in Python. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn