Seite 1 von 1

Datei einlesen und teile der Datei in neue Datei schreiben

Verfasst: Donnerstag 31. August 2006, 13:03
von Blackgarfield
Hallo

ich möchte ein script schreiben, welches ich als "Datei-Parser" verwenden möchte. Dafür wird die entsprechene Datei geöffnet und zeilenweise eingelesen (*funtioniert*).

Nun soll an Zeile x gesprungen werden und der restliche Inhalt der Datei in eine neue Datei geschrieben werden.

Wie mache ich das am besten??

Danke

Re: Datei einlesen und teile der Datei in neue Datei schreib

Verfasst: Donnerstag 31. August 2006, 13:47
von Leonidas
Blackgarfield hat geschrieben:Nun soll an Zeile x gesprungen werden und der restliche Inhalt der Datei in eine neue Datei geschrieben werden.

Wie mache ich das am besten??
Ohne großartig getest zu haben, hätte ich diesen Code im Angebot:

Code: Alles auswählen

# von dritter Zeile
x = 3
f = file('qtwrap.py', 'r')
lines = f.readlines()
f.close()
f_out = file('out', 'w')
f_out.writelines(lines[x-1:])
f_out.close()

Re: Datei einlesen und teile der Datei in neue Datei schreiben

Verfasst: Samstag 2. November 2024, 21:24
von __blackjack__
Aktuell gibt es `file()` nicht mehr (damit ist das als Name für Dateiobjekte frei geworden!) und man würde die ``with``-Anweisung verwenden, und sollte eine Kodierung angeben. ISO-8859-1 ist eine Kodierung die jedem Byte ein Zeichen zuordnet, also auch beliebige Binärdaten ”durchschleusen” kann, und sich hier deshalb eignet das Verhalten des ursprünglichen Programms (fast) nicht zu verändern:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    # von dritter Zeile
    x = 3
    with open("qtwrap.py", "r", encoding="iso-8859-1") as file:
        lines = file.readlines()

    with open("out", "w", encoding="iso-8859-1") as file:
        file.writelines(lines[x - 1 :])


if __name__ == "__main__":
    main()
Diese Lösung liest die komplette Datei in eine Liste mit Zeilendaten ein. Wenn man den Speicherverbrauch unabhängig von der Dateigrösse haben möchte, beispielsweise wenn man grosse Protokolldateien verarbeiten will, oder nicht weiss wie gross die Datei(en) letztlich werden können, bietet sich eine Lösung an, die zeilenweise kopiert (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import islice


def main():
    # von dritter Zeile
    x = 3
    with open("qtwrap.py", "r", encoding="iso-8859-1") as lines:
        with open("out", "w", encoding="iso-8859-1") as file:
            file.writelines(islice(lines, x - 1, None))


if __name__ == "__main__":
    main()