Im letzten Artikel ging es darum, wie du Dateien anlegen, reinschreiben und aus ihnen lesen kannst.
Viel Alltag besteht aber auch darin, haufenweise Dateien von A nach B zu kopieren. Dann werden sie noch umbenannt, damit sie auch ja dem korrekten Schema entsprechen.
Am Ende müssen sie vor dem Versand an Kollegen, Kunden, Dienstleister oder Systeme natürlich noch gepackt werden.
Keiner hat gerne drölfzig einzelne Dateien an seine E-Mails geklebt, die dann mühevoll einzeln heruntergeladen werden müssen.
Natürlich gibt es mit Python auch dafür Hilfen und genau die stelle ich dir heute vor.
Du weißt nicht, was du mit den Dateien machen sollst? Hier findest du Hilfe.
Funktion | Beschreibung |
---|---|
shutil.copy(Quelle, Ziel) | Datei von Quelle nach Ziel kopieren |
shutil.copystats(Quelle, Ziel) | Metainformationen von einer Datei (Quelle) an eine andere, vorhandene Datei (Ziel) kopieren |
os.rename(Quelle, Ziel) | Datei (Quelle) mit neuem Namen (Ziel) versehen |
shutil.make_archive(Name, Typ, Pfad) | Vollständigen Pfad / Ordner archivieren |
zipfile.ZipFile | Einzelne Dateien archivieren |
Dateien kopieren
Python bringt ein Modul (= eine Bibliothek) mit um direkt auf die Betriebssystem-Shell-Tools zugreifen zu können.
Also die Werkzeuge, die in der Konsole verwendet werden können.
Diese Shell-Tools sind in der Bibliothek shutil also Shell-Utilities gesammelt.
shutil.copy(<QUELLE>, <ZIEL>)
import shutil, os
print([file for file in os.listdir('.') if '.txt' in file])
shutil.copy('Beispiel.txt', 'Beispiel_copy.txt')
print([file for file in os.listdir('.') if '.txt' in file])
Mit copy() kannst du Dateien kopieren.
Dazu gibst du in die Funktion zuerst den Pfad, den du kopieren möchtest und danach den Pfad, an den die Datei kopiert werden soll.
Also (Quelle, Ziel).
Allerdings kopiert copy() nur die Inhalte der Dateien. Wenn du Metainformationen wie Erstellungszeit, Bearbeitungszeit, etc. kopieren möchtest, musst du dafür die Funktion copystat() benutzen.
shutil.copystat(<QUELLE>, <ZIEL>)
import shutil, os
print([file for file in os.listdir('.') if '.txt' in file])
shutil.copystat('Beispiel.txt', 'Beispiel_copy.txt')
print([file for file in os.listdir('.') if '.txt' in file])
Die Funktion copystat() kopiert allerdings nur die Metainformationen, nicht die Datei!
Wenn du also eine Datei mit Metainformationen kopieren willst, musst du erst mit copy() eine Kopie anlegen und dann mit copystat() die Metainformationen nachziehen.
Dateien umbenennen
Um Dateien umzubenennen bringt das os Modul von Python die Funktion rename() mit.
Wirf einfach den Ausgangspfad und den Zielpfad in die Funktion wie auch bei copy().
Nur wird in dem Fall die Datei “verschoben”, bzw. umbenannt und keine Kopie erzeugt.
os.rename(<QUELLE>, <ZIEL>)
import os
os.rename('Beispiel_copy.txt', 'Beispiel_Kopie.txt')
print([file for file in os.listdir('.') if '.txt' in file])
Dateien packen
Natürlich darf auch das Verpacken von Dateien nicht fehlen.
Um vollständige Pfade zu verpacken, stellt dir shutil mit der Funktion make_archive() eine einfache und schnelle Möglichkeit bereit.
Du gibst den Namen an, den dein Archiv haben soll. Als Nächstes kommt die Archiv-Art, also ZIP oder TAR und abschließend noch der Pfad, den du in ein Archiv packen möchtest.
shutil.make_archive(<NAME>, <TYP> ,<PFAD>)
import os, shutil
if not os.path.exists('Neu'):
os.makedirs('Neu') # makedirs erzeugt den angegebenen Pfad
open('Neu/Datei.txt', 'x').close() # Datei in unserem neuen Ordner anlegen
shutil.make_archive('Neu', 'zip', 'Neu') # Neuen Ordner archivieren
shutil.make_archive('Neu', 'tar', 'Neu')
print([file for file in os.listdir('.') if '.zip' in file or '.tar' in file])
Klasse, ganze Ordner packen funktioniert also.
Meistens reicht es aber eine einzelne Datei oder vielleicht ein paar Dateien in einem Archiv zusammenzufassen.
Dafür musst du nicht erst manuell einen Ordner anlegen und die Dateien zusammen sammeln, nur um dann den Ordner verpacken zu können.
Mit dem Modul zipfile bekommst du die Klasse ZipFile geliefert.
Und mit der wiederum kannst du ganz gezielt Archive so zusammenbauen, wie du sie gerne hättest.
Es funktioniert genauso, wie das Schreiben in Dateien. Nur dass du diesmal keine Texte, sondern ganze Pfade für Dateien angibst.
with ZipFile(<PFAD>, <OPERATION>) as archiv:
archiv.write(<PFAD>)
from zipfile import ZipFile
with ZipFile('einzelne_dateien.zip', 'w') as archiv:
archiv.write('Beispiel.txt')
archiv.write('Beispiel_Kopie.txt')
with ZipFile('einzelne_dateien.tar', 'w') as archiv:
archiv.write('Beispiel.txt')
archiv.write('Beispiel_Kopie.txt')
print([file for file in os.listdir('.') if '.zip' in file or '.tar' in file])
Zusammenfassung
- shutil.copy() und shutil.copystats() kopieren Dateien und ihre zugehörigen Metainformationen.
- Über os.rename() können Dateien umbenannt werden.
- shutils.make_archive() archiviert ganze Pfade.
- zipfile.ZipFile erlaubt das Archivieren einzelner Dateien.
Kurse
Code Challenges und YouTube Videos führen nicht immer zum gewünschten Erfolg.
Manchmal ist es besser, gezielt und strukturiert durch ein Thema zu arbeiten.
Schau dich einfach mal bei meinen Kursen um.
Ohne lästiges Blah Blah steigen wir direkt in das Thema ein und behandeln alles, was du brauchst.
Ingo Janssen ist ein Softwareentwickler mit über 10 Jahren Erfahrung in der Leitung seines eigenen Unternehmens.
Er studierte Wirtschaftsinformatik an der TH Deggendorf und hat Softwareentwicklung an der FOM Hochschule in München unterrichtet.
Ingo hat mit einer Vielzahl von Unternehmen zusammengearbeitet, von kleinen und mittelständischen Unternehmen bis hin zu MDAX- und DAX-gelisteten Unternehmen.
Ingo ist leidenschaftlich daran interessiert, sein Wissen und seine Expertise mit anderen zu teilen. Aus diesem Grund betreibt er einen YouTube-Kanal mit Programmier-Tutorials und eine Discord-Community, in der Entwickler miteinander in Kontakt treten und voneinander lernen können.
Sie können Ingo auch auf LinkedIn, Xing und Gulp finden, wo er Updates über seine Arbeit teilt und Einblicke in die Tech-Branche gibt.
YouTube | Discord | LinkedIn | Xing | Gulp Profile