In diesem Beitrag möchte ich dir zeigen wie du mit Dateien und Ordner in Python3 arbeiten kannst. Dieses Wissen benötigst zu wenn du zbsp. um eine Datei zum be-/verarbeiten zu öffnen.
Wie man eine Datei zum verarbeiten von Daten öffnet habe ich dir bereits im Beitrag Python #10: Dateiverarbeitung erläutert und möchte hier an diesen Beitrag anknüpfen.
Für das be-/verarbeiten von Dateien und Verzeichnisse benötigen wir das Modul „os„. Wollen wir zunächst einmal die Dateien und Verzeichnisse im aktuellen Verzeichnis auflisten.
import os print(os.listdir("."))
Die Funktion „listdir“ erwartet einen Parameter welcher ein Ordner repräsentiert. In meinem oben gezeigten Beispiel repräsentiert der Punkt „.“ das aktuelle Verzeichnis.
C:\python3_test\ordner>dir Volume in Laufwerk C: hat keine Bezeichnung. Volumeseriennummer: 162C-A96C Verzeichnis von C:\python3_test\ordner 09.02.2021 11:41 <DIR> . 09.02.2021 11:41 <DIR> .. 09.02.2021 11:39 35 folders.py 09.02.2021 11:39 <DIR> ordner1 09.02.2021 11:40 <DIR> ordner2 09.02.2021 11:41 0 textdatei.txt 2 Datei(en), 35 Bytes 4 Verzeichnis(se), 71.160.610.816 Bytes frei C:\python3_test\ordner>python3 folders.py ['folders.py', 'ordner1', 'ordner2', 'textdatei.txt'] C:\python3_test\ordner>
Zuerst habe ich den Inhalt des aktuellen Verzeichnisses mit dem Kommandozeilenbefehl „dir“ ausgegeben und danach das Python3 Skript ausgeführt. Wir sehen nun eine Liste mit den Dateien und Verzeichnissen.
prüfen auf Datei oder Verzeichnis
Was wir jedoch nicht erkennen können ist ob der Eintrag in der Liste nun eine Datei oder ein Verzeichnis ist. Dazu müssten wir nun diese Liste durchlaufen und jeweils einzeln prüfen ob dieser Eintrag eine Datei ist („os.path.isfile„). Alternativ kannst du mit „os.path.isdir“ prüfen ob der Eintrag ein Verzeichnis ist.
import os print(os.listdir(".")) for e in os.listdir("."): if os.path.isfile(e): print(e, "ist eine Datei", sep=" ") else: print(e, "ist ein Verzeichnis", sep=" ")
C:\python3_test\ordner>python3 folders.py ['folders.py', 'ordner1', 'ordner2', 'textdatei.txt'] folders.py ist eine Datei ordner1 ist ein Verzeichnis ordner2 ist ein Verzeichnis textdatei.txt ist eine Datei
Zusammenfügen von Pfadangaben
Manchmal möchte man eine bestimmte Datei oder einen bestimmten Ordner Verarbeiten.
Am einfachsten ist es wenn man nun den vollen Pfad sich selber aufbau.
folder = "c:\python3_test" filename = "test.txt" with open(folder+"\\"+filename, "r") as file: for line in file: print (line.strip())
Das klappt auch auf jedem PC mit Windows sehr gut. Aber was ist wenn wir dieses Skript dann auf einen Linux System ausführen möchten? Genau, es funktioniert nicht da wir unter Linux einen anderen Separator für Verzeichnisse und Dateien haben.
Hier hilft uns die Funktion „os.path.join“ weiter, dieser Funktion werden die Ordner / Dateinamen übergeben und wir erhalten eine Betriebssystemspezifische Zeichenkette zurück.
import os folder = "c:\python3_test" filename = "test.txt" with open(os.path.join(folder,filename), "r") as file: for line in file: print (line.strip())
ein kleines Programm zum anzeigen von Ordner & Dateien
Im folgenden wollen wir einmal mit dem Modul „os“ sowie mit der, aus dem letzten Beitrag bekannten Klasse „argv“ aus dem Modul „sys“ ein kleines Programm schreiben.
Ziel ist es den Inhalt eines beliebigen Ordners anzeigen zu lassen. Dabei sollen anzeigt werden:
- der Zeitstempel,
- der Typ (Ordner oder Datei),
- der Name,
- die Größe der Datei
Die Sortierung soll so sein, das zunächst die Ordner und danach die Dateien aufgelistet werden.
#laden der Module import os from datetime import datetime import sys #setzen des default Verzeichnisses #dieses wird verwendet wenn kein Verzeichnis #als Parameter übergeben wird workingfolder = "." #wenn zwei Parameter übergeben wurden #dann soll der zweite genommen und als #"Arbeitsverzeichnis" verwendet werden if len(sys.argv) == 2: print(sys.argv[1]) workingfolder = sys.argv[1] #Liste mit Dateien files = [] #Liste mit Ordner folders = [] #wechseln in das "Arbeitsverzeichnis" os.chdir(workingfolder) #Ausgeben einer Zeichenkette auf der Konsole print("Verzeichnis: ", workingfolder, "wird ausgelesen.", sep=" ") #Für jeden Eintrag aus der Liste mache... for e in os.listdir(workingfolder): #Versuche... try: #Absoluten Pfad zur Datei erstellen currentFile = os.path.join(workingfolder,e) #lesen und formatieren des Zeitstempels timestamp = '{0:%d.%m.%Y %H:%M:%S}'.format(datetime.fromtimestamp(os.stat(currentFile)[7])) #per default ist es erstmal ein Verzeichnis filetype = "<DIR>" isFolder = True #Dateigröße ist leer size = "" #wenn es eine Datei ist dann... if os.path.isfile(currentFile): #den Typen leer lassen #alternativ könnte man hier "<File>" schreiben filetype = "" #es ist kein Verzeichnis isFolder = False #Dateigröße aus den Attributen lesen und in Kilobyte umrechnen size = str(round(os.stat(e)[6]/1024,2))+" KB" #erzeugen einer Zeichenkette mit den ermittelten Werten line = timestamp +"\t"+ filetype +"\t"+ e +"\t"+ size #Wenn der aktuelle Eintrag ein Verzeichnis ist dann #soll dieser in die Liste mit Verzeichnisse aufgenommen werden, #andernfalls soll der Eintrag in die Liste mit Dateien aufgenommen werden. if isFolder: folders.append(line) else: files.append(line) #Wenn ein Fehler auftritt so soll dieser ausgegeben werden except Exception as error: print("Fehler bei "+currentFile) print(error) #Als erstes werden die Ordner ausgegeben for folder in folders: print(folder) #Danach werden die Dateien ausgegeben for file in files: print(file)