** Ajouté le 1 juin 2017 ** Commentaires corrigés par @ kota9 et @ pashango2
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.
-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é
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)
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é
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])
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])
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 **
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.
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