Maison  >  Article  >  développement back-end  >  Comment compresser et décompresser des fichiers ZIP en Python

Comment compresser et décompresser des fichiers ZIP en Python

黄舟
黄舟original
2017-10-04 09:26:051562parcourir

Cet article présente principalement la méthode de compression et de décompression des fichiers ZIP en Python. Il analyse les techniques de fonctionnement courantes de compression et de décompression des fichiers zip en Python sur la base d'exemples spécifiques. Les amis dans le besoin peuvent s'y référer

. L'exemple de cet article décrit comment compresser et décompresser des fichiers ZIP en Python. Partagez-le avec tout le monde pour référence, les détails sont les suivants :

Parfois, nous devons utiliser des fichiers zip en Python, et dans la version 1.6, Python fournit déjà le module zipfile pour effectuer de telles opérations. Cependant, le module zipfile en Python ne peut pas gérer les situations multi-volumes, mais cette situation est rare, elle est donc suffisante pour une utilisation normale. Ci-dessous, je viens d'enregistrer quelques opérations de base sur les fichiers zip, ce qui est suffisant pour gérer la plupart des situations.

Le module zipfile vous permet d'ouvrir ou d'écrire un fichier zip. Par exemple :


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

Ceci ouvre un fichier zip. Si le mode est 'w' ou 'a', cela signifie qu'un fichier zip doit être écrit. S'il est en écriture, vous pouvez également suivre le troisième paramètre :

compression=zipfile.ZIP_DEFLATED ou compression=zipfile.ZIP_STORED ZIP_DEFLATED est l'indicateur de compression. Si vous l'utilisez, vous devez compiler le module zlib. Ce dernier est simplement emballé avec zip et non compressé.

Après avoir ouvert le fichier zip, vous pouvez lire le contenu du fichier zip ou enregistrer le contenu dans le fichier zip selon vos besoins.

Lire le contenu du zip

C'est très simple L'objet zipfile fournit une méthode read(name). Le nom est une entrée de fichier dans le fichier zip. Une fois l'exécution terminée, le contenu lu sera renvoyé dans le fichier souhaité.

Écrire un fichier zip

Il existe deux façons, l'une consiste à écrire directement dans un fichier existant, l'autre consiste à écrire une chaîne.

Pour la première écriture (filename, arcname, compress_type) à l'aide de l'objet zipfile, les deux derniers paramètres peuvent être ignorés. Le premier paramètre est le nom du fichier et le deuxième paramètre est le nom dans le fichier zip. S'il n'est pas indiqué, le même nom que le nom du fichier est utilisé. compress_type est un indicateur de compression qui remplace les paramètres lors de la création d'un fichier zip. La deuxième méthode consiste à utiliser writestr(zinfo_or_arcname, bytes) de l'objet zipfile. Le premier paramètre est l'objet zipinfo ou le nom de compression écrit dans le fichier compressé, et le deuxième paramètre est une chaîne. Utilisez cette méthode pour organiser dynamiquement le contenu d'un fichier.

Il est à noter que lors de la lecture, car seul le contenu peut être lu, si vous souhaitez développer le fichier zip en fonction de la structure des répertoires, ces opérations doivent être effectuées par vous-même, comme la création d'un répertoire , création d'un fichier et écriture . Lors de l'écriture, la structure des répertoires du fichier zip peut être organisée dynamiquement selon les besoins, de sorte que le fichier zip puisse être généré sans suivre la structure des répertoires d'origine.

Donc, pour faciliter l'utilisation, j'ai créé ma propre classe ZFile, qui implémente principalement la compression pour fonctionner dans le menu contextuel de Winrar - c'est-à-dire compresser un fichier zip dans un répertoire spécifié et créer automatiquement le sous-dossier correspondant. Un autre est la commodité de générer des fichiers zip. Le code source de la classe est :


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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn