Dateien mit Python bearbeiten – kopieren, umbenennen, archivieren

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.

FunktionBeschreibung
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.ZipFileEinzelne 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.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Scroll to Top