Python Programming

Effizientes Lesen bestimmter Zeilen aus Dateien in Python

Spread the love

Das effiziente Lesen spezifischer Zeilen aus einer Datei ist für viele Python-Programme entscheidend. Der optimale Ansatz hängt stark von der Dateigröße und der Häufigkeit des Zugriffs auf diese Zeilen ab. Dieser Leitfaden untersucht verschiedene Methoden, die jeweils auf unterschiedliche Szenarien zugeschnitten sind.

Inhaltsverzeichnis

Lesen spezifischer Zeilen aus kleinen Dateien

Für kleine Dateien, die bequem im Speicher Platz finden, bietet die Methode readlines() eine einfache Lösung. Diese Methode liest alle Zeilen in eine Liste ein, wodurch der direkte Zugriff über die Indizierung ermöglicht wird.


def read_specific_lines_small_file(filepath, line_numbers):
    """Liest spezifische Zeilen aus einer kleinen Datei.

    Args:
        filepath: Pfad zur Datei.
        line_numbers: Eine Liste von Zeilennummern (0-basierter Index), die gelesen werden sollen.

    Returns:
        Eine Liste von Strings, die die angeforderten Zeilen enthalten. Gibt eine leere Liste zurück, wenn die Datei nicht gefunden wird.
    """
    try:
        with open(filepath, 'r') as file:
            lines = file.readlines()
            return [lines[i].strip() for i in line_numbers if 0 <= i < len(lines)]
    except FileNotFoundError:
        return []

filepath = "my_small_file.txt"
line_numbers_to_read = [0, 2, 4]  # Zeilen 1, 3 und 5 lesen (0-basierter Index)
lines = read_specific_lines_small_file(filepath, line_numbers_to_read)
for line in lines:
    print(line)

Dieser Ansatz ist zwar unkompliziert, wird aber für größere Dateien ineffizient.

Effizienter Zugriff auf Zeilen bei mehrfacher Nutzung

Wenn Sie wiederholt auf dieselben Zeilen zugreifen, bietet das Modul linecache erhebliche Leistungssteigerungen durch das Zwischenspeichern von Zeilen, wodurch die Festplatten-E/A minimiert wird.


import linecache

def read_specific_lines_linecache(filepath, line_numbers):
    """Liest spezifische Zeilen mit linecache (1-basierte Indizierung).

    Args:
        filepath: Pfad zur Datei.
        line_numbers: Eine Liste von Zeilennummern (1-basierter Index), die gelesen werden sollen.

    Returns:
        Eine Liste von Strings, die die angeforderten Zeilen enthalten. Gibt eine leere Liste zurück, wenn die Datei nicht gefunden wird oder Zeilen außerhalb des Bereichs liegen.
    """
    lines = [linecache.getline(filepath, line_number).strip() for line_number in line_numbers if linecache.getline(filepath, line_number)]
    return lines


filepath = "my_file.txt"
line_numbers_to_read = [1, 3, 5]  # Zeilen 1, 3 und 5 lesen (1-basierter Index)
lines = read_specific_lines_linecache(filepath, line_numbers_to_read)
for line in lines:
    print(line)

Beachten Sie, dass linecache eine 1-basierte Indizierung verwendet.

Effizientes Verarbeiten großer Dateien

Vermeiden Sie bei großen Dateien das Laden aller Daten in den Speicher. Iterieren Sie zeilenweise mit enumerate(), um die Zeilennummern zu verfolgen.


def read_specific_lines_large_file(filepath, line_numbers):
    """Liest spezifische Zeilen effizient aus einer großen Datei.

    Args:
        filepath: Pfad zur Datei.
        line_numbers: Eine Liste von Zeilennummern (0-basierter Index), die gelesen werden sollen.

    Returns:
        Eine Liste von Strings, die die angeforderten Zeilen enthalten. Gibt eine leere Liste zurück, wenn die Datei nicht gefunden wird.
    """
    try:
        lines_to_return = []
        with open(filepath, 'r') as file:
            for i, line in enumerate(file):
                if i in line_numbers:
                    lines_to_return.append(line.strip())
        return lines_to_return
    except FileNotFoundError:
        return []

filepath = "my_large_file.txt"
line_numbers_to_read = [100, 500, 1000]  # Zeilen 101, 501 und 1001 lesen (0-basierter Index)
lines = read_specific_lines_large_file(filepath, line_numbers_to_read)
for line in lines:
    print(line)

Diese Methode ist speichereffizient für große Dateien.

Erweiterte Techniken für massive Datensätze

Bei außergewöhnlich großen Dateien, die den verfügbaren RAM übersteigen, sollten Sie speicherabgebildete Dateien oder spezialisierte Bibliotheken wie dask oder vaex in Betracht ziehen, die für die Verarbeitung von Datensätzen entwickelt wurden, die nicht in den Speicher passen.

Häufig gestellte Fragen

  • F: Was ist, wenn eine Zeilennummer außerhalb des Bereichs liegt? Die bereitgestellten Methoden behandeln Zeilennummern außerhalb des Bereichs problemlos, indem sie einfach weggelassen werden.
  • F: Kann ich Zeilen basierend auf einer Bedingung anstelle einer Zeilennummer lesen? Ja, ersetzen Sie die Zeilennummernprüfung durch eine Bedingung (z. B. if "Schlüsselwort" in line:).

Schreibe einen Kommentar

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