Extraire récursivement des fichiers zip avec python

** Ajouté le 1 juin 2017 ** Commentaires corrigés par @ kota9 et @ pashango2

introduction

C'est la première fois que j'écris un article. En arrière-plan, lorsque j'ai téléchargé les données nécessaires à la recherche, il y avait un fichier zip dans le fichier zip et il avait à nouveau une structure comme un fichier zip, alors j'ai écrit un script qui le développe automatiquement. C'est parce que j'y ai pensé. Aussi, pour les débutants, je présenterai le code tout au long du processus auquel j'ai pensé. Si vous pouvez vous le permettre, regardez simplement le dernier code.

Commentaire

1. Visez avec ce script

-Extraire le fichier zip récursivement -Autoriser l'exécution même si un répertoire est spécifié -Supprimer automatiquement le fichier zip décompressé

2. Flux de processus

Notez le flux général du traitement.

(1) Vérifiez si l'argument de ligne de commande est un fichier zip ou un répertoire (2) Traitement des exceptions

(3) S'il s'agit d'un fichier zip (3.1) Extraire le fichier zip spécifié (3.2) Supprimer le fichier zip après l'extraction

(4) S'il s'agit d'un répertoire (4.1) Effectuez (3) pour le fichier zip dans le répertoire (4.2) Répéter (4) pour les répertoires du répertoire

(4) est un peu difficile à comprendre, mais le but est d'extraire le fichier zip, et s'il s'agit d'un répertoire, recherchez à nouveau le fichier zip. Étant donné que le fichier zip décompressé peut être un répertoire, j'ai pensé qu'il serait plus efficace de décompresser le fichier zip avant de procéder à la recherche dans le répertoire. (Voir ci-dessous)

3. Code réel

(1) Vérifiez si l'argument de ligne de commande est un fichier zip ou un répertoire

L'instruction d'exécution supposée cette fois est

$ python expand_zip.py ZIP_FILE_NAME

Ou

$ python expand_zip.py DIR_NAME

Par conséquent, il est nécessaire de modifier le processus en fonction de celui qui a été exécuté.

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys


if __name__ == "__main__":
    args = sys.argv
    if(os.path.isdir(args[1])):
        #Lorsque le répertoire est entré
    else:
        #Lorsqu'un fichier zip est entré

(2) Traitement des exceptions

Le traitement des exceptions est requis car l'entrée est acceptée par l'utilisateur. Je ne suis pas habitué ici non plus, alors corrigez-le si vous faites une erreur.

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            #Lorsque le répertoire est entré
        else:
            #Lorsqu'un fichier zip est entré
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

(3) S'il s'agit d'un fichier zip

(3.1) Extraire le fichier zip spécifié

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            #Lorsque le répertoire est entré
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

** zf.extractall (chemin) ** extraira le fichier zip à l'emplacement du chemin. Cette fois, je vais l'extraire à l'emplacement où le fichier zip existait à l'origine.

(3.2) Supprimer le fichier zip après l'extraction

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            #Lorsque le répertoire est entré
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

(4) S'il s'agit d'un répertoire

(4.1) Effectuez (3) pour le fichier zip dans le répertoire

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile
import glob


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


def walk_in_dir(dir_path):
    for filename in glob.glob(os.path.join(dir_path, "*.zip")):
        unzip(filename=os.path.join(dir_path,filename))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            walk_in_dir(args[1])
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

Dans l'instruction ~~ for, ** os.listdir (dir_path) ** obtient tous les fichiers et répertoires dans dir_path, et le suivant ** if os.path.isfile (os.path.join (dir_path ,,) f)) ** n'obtient que les fichiers qu'il contient, et le dernier ** if u ".zip" dans f ** obtient celui avec l'extension .zip. ~~

** Ajouté le 1 juin 2017 ** En réponse au commentaire de @ pashango2

for filename in (f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f)) if u".zip" in f):

La description

for filename in glob.glob(os.path.join(dir_path, "*.zip")):

Changé en.

** Addendum ici **

(4.2) Répéter (4) pour les répertoires du répertoire

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile
import glob


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


def walk_in_dir(dir_path):
    for filename in glob.glob(os.path.join(dir_path, "*.zip")):
        unzip(filename=os.path.join(dir_path,filename))

    for dirname in (d for d in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, d))):
        walk_in_dir(os.path.join(dir_path, dirname))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            walk_in_dir(args[1])
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

La raison pour laquelle le fichier zip dans le répertoire est développé puis traité récursivement pour tous les répertoires du répertoire est que le résultat de l'extraction du fichier zip peut être un répertoire, donc dans cet ordre. Il est devenu.

De plus, dans ce code, si l'argument de ligne de commande spécifié est un fichier zip, il est développé dans (3) et terminé, il est donc nécessaire de le lister comme cible de récurrence.

Le code final est donc

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile
import glob


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


def walk_in_dir(dir_path):
    for filename in glob.glob(os.path.join(dir_path, "*.zip")):
        unzip(filename=os.path.join(dir_path,filename))

    for dirname in (d for d in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, d))):
        walk_in_dir(os.path.join(dir_path, dirname))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            walk_in_dir(args[1])
        else:
            unzip(os.path.join(args[1]))
            name, _ = os.path.splitext(args[1])
            if (os.path.isdir(name)):
                walk_in_dir(name)
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

Sera.

Résumé

C'était mon premier message, mais ce sera une bonne occasion d'organiser mes connaissances, alors j'aimerais continuer à publier à l'avenir. Si vous trouvez des erreurs dans cet article, veuillez les corriger.

Recommended Posts

Extraire récursivement des fichiers zip avec python
Zip, décompressez avec python
Gérer les fichiers zip avec des noms de fichiers japonais dans Python 3
Tri des fichiers image avec Python (2)
Trier de gros fichiers avec python
Tri des fichiers image avec Python (3)
Tri des fichiers image avec Python
Intégrez des fichiers PDF avec Python
Lire des fichiers .txt avec Python
Manipulation des fichiers EAGLE .brd avec Python
[Python] Fichiers wav POST avec requêtes [POST]
Décrypter les fichiers cryptés avec OpenSSL avec Python 3
Gérer les fichiers Excel CSV avec Python
Lire des fichiers en parallèle avec Python
zip en python
Collectez les liens wikipedia de manière récursive avec python
Lire un fichier audio à partir de Python avec interruption
Décrypter les fichiers cryptés avec openssl depuis python avec openssl
Lire et écrire des fichiers JSON avec Python
Télécharger des fichiers sur le Web avec Python
[Easy Python] Lecture de fichiers Excel avec openpyxl
[Easy Python] Lecture de fichiers Excel avec des pandas
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
[Python] Récupérez les fichiers dans le dossier avec Python
Rechercher récursivement tous les fichiers avec plusieurs extensions spécifiées
Faites glisser et déposez un fichier local avec Selenium (Python)
Encodage de caractères lors du traitement de fichiers en Python 3
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Extraire le zip avec Python (prend en charge les noms de fichiers japonais)
La lecture et l'écriture s'adaptent aux fichiers avec Python (mémo)
Convertissez plusieurs fichiers proto à la fois avec python
Lire les fichiers wav avec uniquement le package standard Python
Décompressez tous les fichiers zip dans le répertoire actuel
Communication série avec Python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Télécharger des fichiers avec Django
Grattage en Python (préparation)
Essayez de gratter avec Python.
Extraire le tableau des fichiers image avec OneDrive et Python