Python OS Modul
Dieses Modul bietet eine portable Möglichkeit, betriebssystemabhängige Funktionalität zu nutzen.
Pathlib vs OS Modul
Das pathlib-Modul bietet weitaus mehr Funktionalität als die hier aufgeführten, wie z.B. das Abrufen des Dateinamens, das Abrufen der Dateiendung, das Lesen/Schreiben einer Datei ohne manuelles Öffnen usw. Sehen Sie sich die offizielle Dokumentation an, wenn Sie mehr erfahren möchten.
Für einen tiefergehenden Blick auf beide, siehe die Seite Datei- und Verzeichnispfade.
Linux- und Windows-Pfade
Unter Windows werden Pfade mit Backslashes (\) als Trennzeichen zwischen Ordnernamen geschrieben. Auf Unix-basierten Betriebssystemen wie macOS, Linux und BSDs wird der Schrägstrich (/) als Pfadtrennzeichen verwendet. Das Zusammenfügen von Pfaden kann mühsam sein, wenn Ihr Code auf verschiedenen Plattformen funktionieren muss.
Glücklicherweise bietet uns Python os.path.join, um dies zu handhaben.
import os
# Pfadkomponenten unter Verwendung des korrekten Trennzeichens für das Betriebssystem zusammenfügen
os.path.join('usr', 'bin', 'spam')
usr\bin\spam
Das Zusammenfügen von Pfaden ist hilfreich, wenn Sie verschiedene Dateipfade unter demselben Verzeichnis erstellen müssen.
my_files = ['accounts.txt', 'details.csv', 'invite.docx']
# Jeden Dateinamen mit dem Basisverzeichnis zusammenfügen
for filename in my_files:
print(os.path.join('/home/labex/project', filename))
/home/labex/project/accounts.txt
/home/labex/project/details.csv
/home/labex/project/invite.docx
Das aktuelle Arbeitsverzeichnis
import os
# Das aktuelle Arbeitsverzeichnis abrufen
os.getcwd()
/home/labex/project
# Das aktuelle Arbeitsverzeichnis ändern
os.chdir('/usr/bin')
# Die Änderung überprüfen
os.getcwd()
/usr/bin
Neue Ordner erstellen
import os
# Verzeichnisse rekursiv erstellen (erstellt alle übergeordneten Verzeichnisse, falls erforderlich)
os.makedirs('/tmp/delicious/walnut/waffles')
Absolute vs. Relative Pfade
Es gibt zwei Möglichkeiten, einen Dateipfad anzugeben.
- Ein absoluter Pfad, der immer mit dem Stammverzeichnis beginnt
- Ein relativer Pfad, der sich auf das aktuelle Arbeitsverzeichnis des Programms bezieht
Es gibt auch die Ordner Punkt (.) und Punkt-Punkt (..). Dies sind keine echten Ordner, sondern spezielle Namen, die in einem Pfad verwendet werden können. Ein einzelner Punkt (“dot”) für einen Ordnernamen ist eine Kurzform für „dieses Verzeichnis“. Zwei Punkte (“dot-dot”) bedeuten „das übergeordnete Verzeichnis“.
Umgang mit absoluten Pfaden
Um zu sehen, ob ein Pfad ein absoluter Pfad ist:
import os
# Prüfen, ob der Pfad absolut ist (beginnt mit dem Stammverzeichnis)
os.path.isabs('/')
True
# Relative Pfade geben False zurück
os.path.isabs('..')
False
Sie können auch einen absoluten Pfad extrahieren:
import os
# Zuerst das aktuelle Verzeichnis abrufen
os.getcwd()
/home/labex/project
# Relativen Pfad in einen absoluten Pfad umwandeln
os.path.abspath('..')
/home
Umgang mit relativen Pfaden
Sie können einen relativen Pfad von einem Startpfad zu einem anderen Pfad erhalten.
import os
# Relativen Pfad vom Startpfad zum Zielpfad abrufen
os.path.relpath('/etc/passwd', '/')
etc/passwd
Pfad- und Dateigültigkeit
Prüfen, ob eine Datei/ein Verzeichnis existiert
import os
# Prüfen, ob der Pfad existiert (Datei oder Verzeichnis)
os.path.exists('.')
True
os.path.exists('setup.py')
True
os.path.exists('/etc')
True
os.path.exists('nonexistentfile')
False
Prüfen, ob ein Pfad eine Datei ist
import os
# Prüfen, ob der Pfad eine Datei ist
os.path.isfile('setup.py')
True
os.path.isfile('/home')
False
os.path.isfile('nonexistentfile')
False
Prüfen, ob ein Pfad ein Verzeichnis ist
import os
# Prüfen, ob der Pfad ein Verzeichnis ist
os.path.isdir('/')
True
os.path.isdir('setup.py')
False
os.path.isdir('/spam')
False
Dateigröße in Bytes abrufen
import os
# Dateigröße in Bytes abrufen
os.path.getsize('/usr/bin/python3')
776192
Verzeichnisse auflisten
import os
# Alle Dateien und Verzeichnisse im angegebenen Pfad auflisten
os.listdir('/usr/bin')
['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
--snip--
'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']
Dateigrößen von Verzeichnissen
WARNUNG
Verzeichnisse selbst haben auch eine Größe! Sie sollten also prüfen, ob ein Pfad eine Datei oder ein Verzeichnis ist, indem Sie die Methoden verwenden, die im obigen Abschnitt besprochen wurden.
import os
total_size = 0
# Gesamtgröße aller Dateien im Verzeichnis berechnen
for filename in os.listdir('/usr/bin'):
# Verzeichnispfad mit Dateiname zusammenfügen und Größe abrufen
total_size = total_size + os.path.getsize(os.path.join('/usr/bin', filename))
print(total_size)
1117846456
Dateien und Ordner löschen
Der Aufruf von
os.unlink(path)löscht die Datei unter dem Pfad.Der Aufruf von
os.rmdir(path)löscht den Ordner unter dem Pfad. Dieser Ordner muss leer von Dateien oder Ordnern sein.
Durch einen Verzeichnisbaum durchlaufen
import os
# Rekursiv durch den Verzeichnisbaum durchlaufen
for folder_name, subfolders, filenames in os.walk('/tmp/delicious'):
print(f'Der aktuelle Ordner ist {folder_name}')
# Unterverzeichnisse durchlaufen
for subfolder in subfolders:
print(f'UNTERORDNER VON {folder_name}: {subfolder}')
# Dateien durchlaufen
for filename in filenames:
print(f'DATEI IN {folder_name}: filename{filename}')
print('')
Der aktuelle Ordner ist /tmp/delicious
UNTERORDNER VON /tmp/delicious: cats
UNTERORDNER VON /tmp/delicious: walnut
DATEI IN /tmp/delicious: spam.txt
Der aktuelle Ordner ist /tmp/delicious/cats
DATEI IN /tmp/delicious/cats: catnames.txt
DATEI IN /tmp/delicious/cats: zophie.jpg
Der aktuelle Ordner ist /tmp/delicious/walnut
UNTERORDNER VON /tmp/delicious/walnut: waffles
Der aktuelle Ordner ist /tmp/delicious/walnut/waffles
DATEI IN /tmp/delicious/walnut/waffles: butter.txt