Python
Einfaches Abrufen aller Dateien in einem Verzeichnis in Python: Ein Anfängerleitfaden

Einfaches Abrufen aller Dateien in einem Verzeichnis in Python: Ein Anfängerleitfaden

MoeNagy Dev

Verständnis der Dateipfade

Absolute vs. Relative Pfade

In Python können Sie mit absoluten und relativen Dateipfaden arbeiten. Ein absoluter Pfad ist der vollständige, eindeutige Speicherort einer Datei oder Verzeichnisses, der vom Stammverzeichnis des Dateisystems aus startet. Ein relativer Pfad hingegen ist ein Pfad, der relativ zum aktuellen Arbeitsverzeichnis oder einem bestimmten Speicherort im Dateisystem ist.

Hier ist ein Beispiel für die Verwendung von absoluten und relativen Pfaden in Python:

# Absoluter Pfad
absolute_path = "/Users/Benutzername/dokumente/datei.txt"
 
# Relativer Pfad
relative_path = "dokumente/datei.txt"

Sie können die Funktion os.path.abspath() verwenden, um einen relativen Pfad in einen absoluten Pfad umzuwandeln:

import os
 
relativer_pfad = "dokumente/datei.txt"
absoluter_pfad = os.path.abspath(relativer_pfad)
print(absoluter_pfad)
# Ausgabe: /Benutzer/Benutzername/dokumente/datei.txt

Navigieren im Dateisystem mit Python

Die Module os und os.path in Python bieten eine Reihe von Funktionen zum Navigieren im Dateisystem. Hier sind einige häufig verwendete Funktionen:

  • os.getcwd(): Gibt das aktuelle Arbeitsverzeichnis zurück.
  • os.chdir(path): Ändert das aktuelle Arbeitsverzeichnis in den angegebenen Pfad.
  • os.path.join(path1, path2, ...): Verbindet mehrere Pfadkomponenten intelligent miteinander.
  • os.path.dirname(path): Gibt den Verzeichnisnamen des angegebenen Pfads zurück.
  • os.path.basename(path): Gibt den Basisnamen des angegebenen Pfads zurück.

Beispiel:

import os
 
# Aktuelles Arbeitsverzeichnis abrufen
aktuelles_verzeichnis = os.getcwd()
print(aktuelles_verzeichnis)
 
# Das aktuelle Arbeitsverzeichnis ändern
os.chdir("/Benutzer/Benutzername/dokumente")
neues_verzeichnis = os.getcwd()
print(neues_verzeichnis)
 
# Pfade verbinden
datei_pfad = os.path.join(neues_verzeichnis, "datei.txt")
print(datei_pfad)
 
# Verzeichnis- und Basenamen abrufen
verzeichnis_name = os.path.dirname(datei_pfad)
basis_name = os.path.basename(datei_pfad)
print(verzeichnis_name)
print(basis_name)

Eine Liste der Dateien in einem Verzeichnis abrufen

Verwendung der Funktion os.listdir()

Um eine Liste der Dateien und Verzeichnisse in einem bestimmten Verzeichnis zu erhalten, können Sie die Funktion os.listdir() verwenden. Diese Funktion gibt eine Liste aller Elemente (Dateien und Verzeichnisse) im angegebenen Verzeichnis zurück.

Beispiel:

import os
 
# Liste der Dateien und Verzeichnisse im aktuellen Verzeichnis erhalten
elemente = os.listdir(".")
print(elemente)

Filtern der Liste der Dateien

Sie können die Liste der Dateien und Verzeichnisse filtern, indem Sie den Typ jedes Elements überprüfen, indem Sie die Funktionen os.path.isfile() und os.path.isdir() verwenden.

Beispiel:

import os
 
# Liste der Dateien und Verzeichnisse im aktuellen Verzeichnis erhalten
elemente = os.listdir(".")
 
# Die Liste filtern, um nur die Dateien zu erhalten
dateien = [element for element in elemente if os.path.isfile(element)]
print(dateien)
 
# Die Liste filtern, um nur die Verzeichnisse zu erhalten
verzeichnisse = [element for element in elemente if os.path.isdir(element)]
print(verzeichnisse)

Umgang mit Unterverzeichnissen

Rekursives Durchqueren von Unterverzeichnissen

Um Unterverzeichnisse zu durchqueren und eine Liste aller Dateien in einem Verzeichnisbaum zu erhalten, können Sie einen rekursiven Ansatz verwenden. Dabei wird innerhalb der Funktion dieselbe Funktion oder Logik aufgerufen, um Unterverzeichnisse zu bearbeiten.

Beispiel:

import os
 
def alle_dateien_erhalten(verzeichnis):
    alle_dateien = []
    for element in os.listdir(verzeichnis):
        element_pfad = os.path.join(verzeichnis, element)
        if os.path.isfile(element_pfad):
            alle_dateien.append(element_pfad)
        elif os.path.isdir(element_pfad):
            alle_dateien.extend(alle_dateien_erhalten(element_pfad))
    return alle_dateien
 
# Alle Dateien im aktuellen Verzeichnis und in Unterverzeichnissen erhalten
alle_dateien = alle_dateien_erhalten(".")
print(alle_dateien)

Identifizieren von Verzeichnissen vs. Dateien

Sie können die Funktionen os.path.isfile() und os.path.isdir() verwenden, um festzustellen, ob ein Element im Dateisystem eine Datei oder ein Verzeichnis ist.

Beispiel:

import os
 
# Überprüfen, ob ein Pfad eine Datei ist
if os.path.isfile("datei.txt"):
    print("Es handelt sich um eine Datei!")
else:
    print("Es handelt sich nicht um eine Datei.")
 
# Überprüfen, ob ein Pfad ein Verzeichnis ist
if os.path.isdir("dokumente"):
    print("Es handelt sich um ein Verzeichnis!")
else:
    print("Es handelt sich nicht um ein Verzeichnis.")

Arbeiten mit der Funktion os.walk()

Erkunden der Funktion os.walk()

Die Funktion os.walk() bietet eine bequemere Möglichkeit, einen Verzeichnisbaum rekursiv zu durchqueren und eine Liste aller Dateien und Verzeichnisse zu erhalten. Sie gibt für jedes Verzeichnis im Baum, das am Anfang des Verzeichnisses (das erste Argument) steht, ein 3-Tupel zurück:

  1. Das Stammverzeichnis
  2. Eine Liste der Namen der Unterverzeichnisse in Stammverzeichnis (ohne '.' und '..')
  3. Eine Liste der Namen der Nicht-Verzeichnisdateien in Stammverzeichnis

Beispiel:

import os
 
for verzeichnis, unterverzeichnisse, dateien in os.walk("."):
    print(f"Stammverzeichnis: {verzeichnis}")
    print(f"Unterverzeichnisse: {unterverzeichnisse}")
    print(f"Dateien: {dateien}")
    print()

Anpassen des Verhaltens von os.walk()

Sie können das Verhalten von os.walk() anpassen, indem Sie zusätzliche Argumente bereitstellen:

  • topdown: Wenn True, besucht os.walk() die Verzeichnisse in der Reihenfolge, in der sie im Verzeichnisbaum erscheinen (Standard ist True).
  • onerror: Eine Funktion, die aufgerufen wird, wenn os.walk() auf einen Fehler stößt. Die Funktion sollte ein einzelnes Argument akzeptieren, eine OSError Instanz.
  • followlinks: Wenn True, folgt os.walk() symbolischen Verknüpfungen (Standard ist False).

Beispiel:

import os
 
for verzeichnis, unterverzeichnisse, dateien in os.walk(".", topdown=False, onerror=lambda err: print(f"Fehler: {err}"), followlinks=True):
    print(f"Stammverzeichnis: {verzeichnis}")
    print(f"Unterverzeichnisse: {unterverzeichnisse}")
    print(f"Dateien: {dateien}")
    print()

Dateien nach Erweiterung filtern

Überprüfen der Dateierweiterung

Sie können die Dateierweiterung einer Datei mithilfe der Funktion os.path.splitext() überprüfen, die ein 2-Tupel mit dem Stamm und der Erweiterung des Pfads zurückgibt.

Beispiel:

import os
 
file_path = "documents/file.txt"
root, ext = os.path.splitext(file_path)
print(f"Stamm: {root}")
print(f"Erweiterung: {ext}")

Erstellen einer Liste von Dateien mit bestimmter Erweiterung

Sie können die Überprüfung der Dateierweiterung mit den Techniken zur Verzeichnisdurchquerung kombinieren, um eine Liste von Dateien mit bestimmter Erweiterung zu erstellen.

Beispiel:

import os
 
def get_files_by_extension(verzeichnis, erweiterung):
    all_files = []
    for root, dirs, files in os.walk(verzeichnis):
        for file in files:
            if file.endswith(erweiterung):
                file_path = os.path.join(root, file)
                all_files.append(file_path)
    return all_files
 
# Alle .txt-Dateien im aktuellen Verzeichnis und Unterverzeichnissen erhalten
txt_files = get_files_by_extension(".", ".txt")
print(txt_files)

Sortieren und Organisieren der Dateiliste

Sortieren der Dateiliste

Sie können die Liste der Dateien nach verschiedenen Kriterien sortieren, wie Dateiname, Größe oder Änderungszeit. Die Funktion sorted() in Python ermöglicht es Ihnen, eine Liste von Dateien zu sortieren.

Beispiel:

import os
 
# Die Liste der Dateien im aktuellen Verzeichnis abrufen
files = os.listdir(".")
 
# Die Dateien nach Namen sortieren
sorted_files = sorted(files)
print(sorted_files)
 
# Die Dateien nach Größe sortieren
file_sizes = [(file, os.path.getsize(file)) for file in files]
sorted_by_size = sorted(file_sizes, key=lambda x: x[1])
print(sorted_by_size)

Gruppierung von Dateien nach Erweiterung

Sie können die Dateien nach ihren Erweiterungen gruppieren und ein Wörterbuch oder eine ähnliche Datenstruktur erstellen, um die Dateien zu organisieren.

Beispiel:

import os
from collections import defaultdict
 
def group_files_by_extension(directory):
    file_groups = defaultdict(list)
    for root, dirs, files in os.walk(directory):
        for file in files:
            _, ext = os.path.splitext(file)
            file_path = os.path.join(root, file)
            file_groups[ext].append(file_path)
    return file_groups
 
# Die Dateien im aktuellen Verzeichnis und in Unterverzeichnissen gruppieren
file_groups = group_files_by_extension(".")
for extension, files in file_groups.items():
    print(f"{extension}: {files}")

Umgang mit Fehlern und Randfällen

Umgang mit Berechtigungen und Zugriffsproblemen

Beim Arbeiten mit dem Dateisystem können Berechtigungs- oder Zugriffsprobleme auftreten. Sie können einen try-except-Block verwenden, um diese Fehler abzufangen und eine geeignete Fehlerbehandlung bereitzustellen.

Beispiel:

import os
 
def get_file_info(file_path):
    try:
        file_size = os.path.getsize(file_path)
        last_modified = os.path.getmtime(file_path)
        return file_size, last_modified
    except OSError as e:
        print(f"Fehler beim Zugriff auf die Datei {file_path}: {e}")
        return None, None
 
# Dateiinformationen für eine Datei abrufen
file_info = get_file_info("file.txt")
if file_info[0] is not None:
    file_size, last_modified = file_info
    print(f"Dateigröße: {file_size} Bytes")
    print(f"Zuletzt geändert: {last_modified}")

Umgang mit Symbolic Links und anderen speziellen Dateien

Die Module os und os.path in Python können verschiedene Arten von speziellen Dateien wie symbolischen Links, benannten Pipes und Gerätedateien verarbeiten. Sie können die Funktion os.path.islink() verwenden, um zu überprüfen, ob eine Datei ein symbolischer Link ist.

Beispiel:

import os
 
def handle_special_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.islink(file_path):
                print(f"Symbolischer Link: {file_path}")
            elif os.path.isfifo(file_path):
                print(f"Benannter Pipe: {file_path}")
            elif os.path.isdev(file_path):
                print(f"Gerätedatei: {file_path}")
            else:
                print(f"Reguläre Datei: {file_path}")
 
# Bearbeiten von speziellen Dateien im aktuellen Verzeichnis und in Unterverzeichnissen
handle_special_files(".")

Datenstrukturen

Listen

Listen sind eine der grundlegendsten Datenstrukturen in Python. Sie sind geordnete Sammlungen von Elementen, die Werte verschiedener Datentypen enthalten können, einschließlich Zahlen, Zeichenketten und sogar anderen Datenstrukturen wie Listen oder Wörterbüchern.

Hier ist ein Beispiel für das Erstellen einer Liste und das Ausführen einiger gängiger Operationen:

# Erstellen einer Liste
fruits = ['Apfel', 'Banane', 'Kirsche']
 
# Elemente abrufen
print(fruits[0])  # Ausgabe: 'Apfel'
print(fruits[-1])  # Ausgabe: 'Kirsche'
 
# Elemente hinzufügen
fruits.append('Orange')
print(fruits)  # Ausgabe: ['Apfel', 'Banane', 'Kirsche', 'Orange']
 
# Elemente entfernen
fruits.remove('Banane')
print(fruits)  # Ausgabe: ['Apfel', 'Kirsche', 'Orange']
 
# Slicing
print(fruits[1:3])  # Ausgabe: ['Kirsche', 'Orange']

Tupel

Tupel sind ähnlich wie Listen, aber sie sind unveränderlich, d.h. Sie können ihren Inhalt nach der Erstellung nicht ändern. Tupel werden mit Klammern () anstelle von eckigen Klammern [] definiert.

# Erstellen eines Tupels
point = (2, 3)
print(point)  # Ausgabe: (2, 3)
 
# Elemente abrufen
print(point[0])  # Ausgabe: 2
print(point[1])  # Ausgabe: 3
 
# Entpacken eines Tupels
x, y = point
print(x)  # Ausgabe: 2
print(y)  # Ausgabe: 3

Wörterbücher

Wörterbücher sind ungeordnete Sammlungen von Schlüssel-Wert-Paaren. Sie ermöglichen es Ihnen, Daten schnell mithilfe eindeutiger Schlüssel zu speichern und abzurufen.

# Erstellen eines Wörterbuchs
person = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}
 
# Werte abrufen
print(person['name'])  # Ausgabe: 'John Doe'
print(person['age'])  # Ausgabe: 30
 
# Hinzufügen und Ändern von Einträgen
person['email'] = 'john.doe@example.com'
person['age'] = 31
print(person)  # Ausgabe: {'name': 'John Doe', 'age': 31, 'city': 'New York', 'email': 'john.doe@example.com'}
 
# Über ein Wörterbuch iterieren
for key, value in person.items():
    print(f"{key}: {value}")

Mengen

Sets sind ungeordnete Sammlungen von eindeutigen Elementen. Sie sind nützlich für die Durchführung von Operationen wie Vereinigung, Schnittmenge und Differenz.

# Erstellung eines Sets
colors = {'rot', 'grün', 'blau'}
print(colors)  # Ausgabe: {'rot', 'grün', 'blau'}
 
# Hinzufügen und Entfernen von Elementen
colors.add('gelb')
colors.remove('grün')
print(colors)  # Ausgabe: {'rot', 'blau', 'gelb'}
 
# Set-Operationen
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 | set2)  # Vereinigung: {1, 2, 3, 4}
print(set1 & set2)  # Schnittmenge: {2, 3}
print(set1 - set2)  # Differenz: {1}

Kontrollstrukturen

Bedingte Anweisungen

Bedingte Anweisungen wie if-else und if-elif-else ermöglichen die Ausführung verschiedener Codeblöcke basierend auf bestimmten Bedingungen.

# If-else-Anweisung
age = 18
if age >= 18:
    print("Du bist volljährig.")
else:
    print("Du bist minderjährig.")
 
# If-elif-else-Anweisung
score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("D")

Schleifen

Schleifen wie for und while ermöglichen die wiederholte Ausführung eines Codeblocks.

# For-Schleife
fruits = ['Apfel', 'Banane', 'Kirsche']
for fruit in fruits:
    print(fruit)
 
# While-Schleife
count = 0
while count < 5:
    print(count)
    count += 1

List Comprehensions

List Comprehensions bieten eine prägnante Möglichkeit, neue Listen basierend auf vorhandenen Listen zu erstellen.

# List Comprehension
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
print(squares)  # Ausgabe: [1, 4, 9, 16, 25]
 
# Bedingte List Comprehension
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # Ausgabe: [2, 4]

Funktionen

Funktionen sind wiederverwendbare Codeblöcke, die eine bestimmte Aufgabe ausführen. Sie können Argumente akzeptieren, Werte zurückgeben und Ihnen helfen, Ihren Code zu organisieren.

# Definition einer Funktion
def greet(name):
    print(f"Hallo, {name}!")
 
# Aufruf der Funktion
greet("Alice")  # Ausgabe: Hallo, Alice!
 
# Funktionen mit Rückgabewerten
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # Ausgabe: 7

Module und Pakete

Die umfangreiche Standardbibliothek und Drittanbieterpakete von Python bieten eine Vielzahl von Funktionen, die Sie in Ihren Projekten nutzen können.

# Importieren eines Moduls
import math
print(math.pi)  # Ausgabe: 3.141592653589793
 
# Importieren bestimmter Funktionen aus einem Modul
from math import sqrt, floor
print(sqrt(16))  # Ausgabe: 4.0
print(floor(3.7))  # Ausgabe: 3
 
# Importieren eines Paketes
import datetime
print(datetime.datetime.now())  # Ausgabe: 2023-04-24 12:34:56.789012

Fehlerbehandlung

Die Fehlerbehandlung ermöglicht Ihnen eine elegante Behandlung von Fehlern und unerwarteten Situationen in Ihrem Code.

# Fehlerbehandlung
try:
    result = 10 / 0
except ZeroDivisionError:
    print("Fehler: Division durch Null.")
 
# Behandlung mehrerer Ausnahmen
try:
    int('abc')
except ValueError:
    print("Fehler: Ungültiges Integer-Format.")

Datei I/O

Python bietet integrierte Funktionen und Methoden zum Lesen aus und Schreiben in Dateien.

# Schreiben in eine Datei
with open('beispiel.txt', 'w') as file:
    file.write("Hallo, Welt!")
 
# Lesen aus einer Datei
with open('beispiel.txt', 'r') as file:
    content = file.read()
    print(content)  # Ausgabe: Hallo, Welt!

Fazit

In diesem Python-Tutorial haben Sie verschiedene Datenstrukturen, Kontrollstrukturen, Funktionen, Module und Pakete, Fehlerbehandlung sowie Datei I/O kennengelernt. Diese Konzepte bilden die Grundlage der Python-Programmierung und helfen Ihnen dabei, effizienteren und wartbaren Code zu schreiben. Vergessen Sie nicht, regelmäßig zu üben und die umfangreiche Palette an Python-Bibliotheken und -Frameworks zu erkunden, um Ihr Wissen und Ihre Fähigkeiten zu erweitern.

MoeNagy Dev