HOWTO · Python

Überprüfen Sie, ob die Datei in Python leer ist

Wir werden lernen, wie man überprüft, ob Dateien leer sind oder nicht. Wir werfen auch einen Blick auf verschiedene Probleme, die beim Überprüfen einer leeren Datei in Python aufgetreten sind.

Auf dieser Seite

Eine Datei mit null Byte enthält keine Bytes. Bei strukturierten Daten kann „leer“ jedoch etwas anderes bedeuten: Eine CSV-Datei kann beim Einlesen keine Zeilen ergeben, und eine Excel-Arbeitsmappe kann Formatierungen oder Tabellenblatt-Metadaten enthalten, obwohl ein Tabellenblatt keine Datensätze hat. Wählen Sie die Prüfung passend zu Ihrer Frage. Eine Dateigrößenprüfung zeigt, ob eine reguläre Datei Bytes enthält; eine Tabellenprüfung zeigt, ob eine eingelesene Tabelle Zeilen hat.

Prüfen, ob eine Datei anhand ihrer Größe leer ist

Das Dateisystem gibt die Größe in Byte an. Bei einer regulären Datei bedeutet die Größe 0, dass sie keine Bytes enthält. Eine Größe größer als null beweist nicht, dass eine Textdatei sinnvolle Inhalte enthält: Sie könnte nur Leerraum, eine Byte-Reihenfolge-Markierung oder andere Daten enthalten, die Ihre Anwendung nicht verwendet. Wenn Sie mit „leer“ meinen, dass kein Text außer Leerraum vorhanden ist, lesen Sie stattdessen den dekodierten Inhalt ein und prüfen Sie ihn.

Dieses Beispiel erstellt seine Eingabedatei in einem temporären Ordner und entfernt sie, sobald der Block endet. Es verwendet nur die Python-Standardbibliothek. Sie können es daher in ein Skript übernehmen, ohne eine separate Datendatei vorzubereiten oder einen computerspezifischen Pfad anzupassen. Die Prüfungen liefern boolesche Werte zurück, die Ihr Programm in einer Bedingung verwenden oder an eine Protokollierungsfunktion übergeben kann. Führen Sie dieses Beispiel aus. Die Codeblöcke bleiben unverändert; die booleschen Ausgaben erscheinen als True oder False.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    path.write_text("Ready to process.\n", encoding="utf-8")
    print(path.is_file())
    print(path.stat().st_size == 0)

Das temporäre Verzeichnis macht das Beispiel unabhängig von den Ordnern eines bestimmten Computers. Die erste Prüfung stellt fest, ob der Pfad auf eine reguläre Datei verweist; die zweite prüft, ob ihre Größe in Byte null beträgt.

Eine Datei mit pathlib prüfen

Verwenden Sie Path.is_file(), bevor Sie die Größe einer Datei abfragen. Die Methode gibt False zurück, wenn der Pfad nicht vorhanden ist oder nicht auf eine reguläre Datei verweist. Ersetzen Sie in einer echten Anwendung path durch den Pfad, den Sie als Eingabe erhalten. Für Windows-Pfade sollten Sie einen Raw-String verwenden, wenn Backslashes sonst als Escape-Zeichen interpretiert würden. Die Meldungen, die der unveränderte Code ausgibt, bleiben auf Englisch.

from pathlib import Path

path = Path("notes.txt")
if not path.is_file():
    print("The path is missing or is not a regular file.")
else:
    try:
        empty = path.stat().st_size == 0
    except OSError as error:
        print(f"Could not check the file: {error}")
    else:
        print(f"Empty: {empty}")

Die Größenabfrage steht im try-Block, weil die Datei verschwinden oder unzugänglich werden kann, nachdem is_file() erfolgreich war. Schlägt stat() fehl, meldet das Beispiel den Dateisystemfehler, statt die Datei als leer zu behandeln. Für eine einmalige Prüfung ist Path.stat().st_size == 0 der direkte Test. Eine gleichwertige Alternative ist os.path.getsize(path) == 0, die auch pfadähnliche Objekte akzeptiert.

Prüfen, ob eine CSV-Datei Zeilen enthält

CSV-Dateien sind Text, der eingelesen und interpretiert wird. Ihre Dateigröße ist daher kein verlässlicher Maßstab für die Anzahl der Datensätze. Eine Datei mit einer Kopfzeile, aber ohne Datenzeilen, enthält Bytes und zugleich keine Datensätze. Umgekehrt ergibt eine CSV-Datei, die nur Leerzeilen enthält, möglicherweise keine brauchbare Tabelle. Bei pandas ist DataFrame.empty wahr, wenn eine der beiden Achsen die Länge null hat; das bedeutet nicht, dass alle Zellen leer sind. Installieren Sie pandas, um diesen Ansatz zu verwenden.

Das folgende eigenständige Beispiel erstellt vor dem Einlesen eine kleine CSV-Datei. pandas.read_csv() kann pandas.errors.EmptyDataError auslösen, wenn keine Spalten eingelesen werden können. Behandeln Sie diesen konkreten Fall getrennt von einer fehlenden Datei, einem Berechtigungsproblem oder einer fehlerhaften CSV-Datei, denn jeder dieser Fälle erfordert eine andere Reaktion. Die unveränderten Meldungen im Code bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory

try:
    import pandas as pd
except ImportError:
    print("Install pandas to run this example.")
else:
    with TemporaryDirectory() as folder:
        path = Path(folder) / "records.csv"
        path.write_text("name\nAda\n", encoding="utf-8")
        try:
            table = pd.read_csv(path)
        except pd.errors.EmptyDataError:
            print("The CSV has no parseable columns.")
        else:
            print(table.empty)

Prüfen, ob ein Excel-Tabellenblatt Zeilen enthält

Eine .xlsx-Datei enthält sowohl die Struktur der Arbeitsmappe als auch Zellwerte. Ihre Größe in Byte verrät daher nicht, ob ein bestimmtes Tabellenblatt Datensätze enthält. Lesen Sie das Tabellenblatt ein und prüfen Sie den resultierenden DataFrame. read_excel() verwendet standardmäßig das erste Tabellenblatt; geben Sie sheet_name an, wenn sich die Daten an anderer Stelle befinden. Zum Einlesen von Excel-Dateien benötigen Sie pandas und eine kompatible Excel-Engine, zum Beispiel openpyxl für viele .xlsx-Dateien.

Passen Sie den Pfad und den Namen des Tabellenblatts an die Arbeitsmappe an, die Sie erhalten. DataFrame.empty prüft, ob Zeilen oder Spalten vorhanden sind; eine Zeile mit leeren Zellen zählt weiterhin als Zeile. Wenn die Arbeitsmappe keine brauchbaren Zeilen, aber Überschriften enthält, kann die Tabelle Spalten und null Zeilen haben. Genau diesen üblichen Fall soll die Prüfung erkennen. Die Existenzprüfung unten gibt eine klare Meldung aus, wenn die Arbeitsmappe bereits fehlt. Sie kann jedoch auch verschwinden, bevor read_excel() sie öffnet; deshalb behandelt der Lesevorgang FileNotFoundError gesondert. Die unveränderten Meldungen im Code bleiben auf Englisch.

from pathlib import Path

try:
    import pandas as pd
except ImportError:
    print("Install pandas and an Excel engine to read a workbook.")
else:
    workbook = Path("data.xlsx")
    if not workbook.is_file():
        print("Provide the path to an existing workbook.")
    else:
        try:
            table = pd.read_excel(workbook, sheet_name="Sheet1")
        except FileNotFoundError:
            print("The workbook disappeared before it could be read.")
        except PermissionError:
            print("Permission denied while reading the workbook.")
        except (ImportError, ValueError) as error:
            print(f"Could not read the selected sheet or Excel engine: {error}")
        else:
            print(table.empty)

Fehlende Dateien und Lesefehler behandeln

Verwenden Sie keine allgemeine except:-Klausel, um jeden fehlgeschlagenen Lesevorgang als leere Datei zu kennzeichnen. Ein fehlender Pfad, verweigerter Zugriff, fehlerhafte Eingabedaten und eine gültige Datei ohne Zeilen sind unterschiedliche Fälle. Prüfen Sie bei normalen Dateien is_file() und fangen Sie Fehler vom Typ OSError rund um stat() ab, wenn sich der Pfad ändern kann oder der Prozess möglicherweise keinen Zugriff hat. Fangen Sie bei pandas EmptyDataError ab, wenn eine CSV-Datei keine auswertbaren Spalten enthält. Behandeln Sie anschließend FileNotFoundError, PermissionError sowie Parser- oder Engine-Fehler entsprechend den Anforderungen Ihrer Anwendung. Lassen Sie unerwartete Fehler während der Entwicklung sichtbar, statt sie stillschweigend als leere Daten zu behandeln.

Entscheidend ist, was Sie messen: Verwenden Sie das Dateisystem, wenn es um Bytes geht, und lesen Sie CSV- oder Excel-Daten ein, wenn Sie wissen möchten, ob eine Tabelle oder ein Tabellenblatt Zeilen enthält. Weder eine Größe größer als null noch eine vollständig leere Zeile beweist, dass brauchbare Datensätze vorhanden sind. Legen Sie anhand der Anwendung, die die Datei verarbeitet, fest, was als „brauchbar“ gilt.