Datei einlesen und teile der Datei in neue Datei schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Blackgarfield
User
Beiträge: 5
Registriert: Mittwoch 30. August 2006, 16:11
Wohnort: Cottbus

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten