Python #32 – arbeiten mit Dateien und Verzeichnisse

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. 

Python3 - anzeigen von Ordnerinhalten
Python3 – anzeigen von Ordnerinhalten
#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)


 

Kommentar hinterlassen

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