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
Morty Proxy This is a proxified and sanitized view of the page, visit original site.