** Hinzugefügt am 1. Juni 2017 ** Korrigierte Kommentare von @ kota9 und @ pashango2
Ich schreibe zum ersten Mal einen Artikel. Als Hintergrund, als ich die für die Recherche erforderlichen Daten herunterlud, befand sich eine Zip-Datei in der Zip-Datei, die wieder wie eine Zip-Datei strukturiert war. Deshalb habe ich ein Skript geschrieben, das sie automatisch erweitert. Es war, weil ich darüber nachdachte. Für Anfänger werde ich den Code auch in den Prozess einführen, über den ich nachgedacht habe. Wenn Sie es sich leisten können, schauen Sie sich einfach den letzten Code an.
-Extrahieren Sie die Zip-Datei rekursiv -Erlauben Sie die Ausführung, auch wenn ein Verzeichnis angegeben ist -Automatisch löschen Sie die entpackte Zip-Datei
Notieren Sie den allgemeinen Verarbeitungsfluss.
(1) Überprüfen Sie, ob das Befehlszeilenargument eine Zip-Datei oder ein Verzeichnis ist (2) Ausnahmebehandlung
(3) Wenn es sich um eine Zip-Datei handelt (3.1) Extrahieren Sie die angegebene Zip-Datei (3.2) Löschen Sie die Zip-Datei nach dem Extrahieren
(4) Wenn es sich um ein Verzeichnis handelt (4.1) Führen Sie (3) für die Zip-Datei im Verzeichnis aus (4.2) Wiederholen Sie (4) für die Verzeichnisse im Verzeichnis
(4) ist etwas schwer zu verstehen, aber es geht darum, die Zip-Datei zu extrahieren. Wenn es sich um ein Verzeichnis handelt, suchen Sie erneut nach der darin enthaltenen Zip-Datei. Da es sich bei der entpackten Zip-Datei möglicherweise um ein Verzeichnis handelt, hielt ich es für effizienter, die Zip-Datei zu entpacken, bevor Sie mit der Verzeichnissuche fortfahren. (Siehe unten)
Die diesmal angenommene Ausführungsanweisung lautet
$ python expand_zip.py ZIP_FILE_NAME
Oder
$ python expand_zip.py DIR_NAME
Daher ist es notwendig, den Prozess abhängig davon zu ändern, welcher ausgeführt wurde.
expand_zip.py
# -*- coding: utf-8 -*-
import os
import sys
if __name__ == "__main__":
args = sys.argv
if(os.path.isdir(args[1])):
#Wenn das Verzeichnis eingegeben wird
else:
#Wenn eine Zip-Datei eingegeben wird
Eine Ausnahmeverarbeitung ist erforderlich, da Eingaben vom Benutzer akzeptiert werden. Ich bin auch hier nicht daran gewöhnt, bitte korrigieren Sie es, wenn Sie einen Fehler machen.
expand_zip.py
# -*- coding: utf-8 -*-
import os
import sys
if __name__ == "__main__":
args = sys.argv
try:
if(os.path.isdir(args[1])):
#Wenn das Verzeichnis eingegeben wird
else:
#Wenn eine Zip-Datei eingegeben wird
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])):
#Wenn das Verzeichnis eingegeben wird
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 (Pfad) ** extrahiert die Zip-Datei an den Pfad. Dieses Mal werde ich es an den Speicherort extrahieren, an dem die Zip-Datei ursprünglich vorhanden war.
(3.2) Löschen Sie die Zip-Datei nach dem Extrahieren
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])):
#Wenn das Verzeichnis eingegeben wird
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])
In der Anweisung ~~ for ruft ** os.listdir (dir_path) ** alle Dateien und Verzeichnisse in dir_path ab und dann ** wenn os.path.isfile (os.path.join (dir_path ,,) f)) ** erhält nur die darin enthaltenen Dateien und das letzte **, wenn u ".zip" in f ** die mit der Erweiterung .zip. ~~
** Hinzugefügt am 1. Juni 2017 ** Als Antwort auf den Kommentar von @ 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):
Die Beschreibung
for filename in glob.glob(os.path.join(dir_path, "*.zip")):
Gewechselt zu.
** Nachtrag zu hier **
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])
Der Grund, warum die Zip-Datei im Verzeichnis erweitert und dann für alle Verzeichnisse im Verzeichnis rekursiv verarbeitet wird, besteht darin, dass das Extraktionsergebnis der Zip-Datei möglicherweise ein Verzeichnis ist, also diese Reihenfolge Es ist geworden.
Wenn in diesem Code das angegebene Befehlszeilenargument eine Zip-Datei ist, wird es in (3) erweitert und beendet, sodass es als Ziel für die Wiederholung aufgeführt werden muss.
Der endgültige Code lautet also
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])
Wird sein.
Dies war mein erster Beitrag, aber es wird eine gute Gelegenheit sein, mein Wissen zu organisieren, daher möchte ich auch in Zukunft weiter posten. Wenn Sie in diesem Artikel Fehler finden, korrigieren Sie diese bitte.
Recommended Posts