Informatik Sek II
Objektorientiertes Programmieren

Python
LFB.-Kurs
W. Arnhold
[ Übersicht | vorige Seite | Ganz unten ]
Python Python - Syntax
Dateibearbeitung  II

Dateien : zeilenweise bearbeiten

Etwas ist unschön: Wenn man eine gelesene Datei auf den Bildschirm ausgibt, bekommt man (wegen "print") immer Leerzeichen zwischen den Zeichen; wenn man sie in eine andere Datei umkopiert, geht es ohne. Wie kann man das umgehen? Wir verwenden als Einleseanweisung "readline". Es liest eine ganze Zeile auf einmal.

diese = open ("dateien1.py", "r")

while 1:
        zeile = diese.readline()
        if not zeile:
                break
        print zeile

diese.close()

print 'Hoppla, jetzt gibt es keine überflüssigen Leerzeichen mehr, '
print 'dafür aber Leerzeilen! Also noch mal!'

print 'Bitte  für mehr!'
raw_input()

Wie kommt das? Es liegt daran, dass die Datei Zeilenwechselzeichen enthält, die bei "readline" mitgelesen und nicht entfernt werden. Was kann man tun? Man kann versuchen, sie gar nicht erst mitzulesen:

diese = open ("dateien1.py", "r")

while 1:

        zeile = diese.readline()[:-1]

Das haben wir bei den Sequenzen gelernt. Etwas riskant ist es: wenn am Ende der letzten Zeile ein Zeilenwechselzeichen fehlt, hacken wir uns das letzte Zeichen weg. Besser wäre:

        zeile = diese.readline()
        if not zeile:
                break
        if zeile[-1] == '\n':
                zeile = zeile[:-1]
        print zeile

diese.close()

Wieder ein paar Anmerkungen:
  • Man kann auch an "readline" eine Zahl mitgeben. Diese gibt dann an, wieviele Bytes höchstens aus einer Zeile gelesen werden dürfen. Der Rest der Zeile wird dann beim nächsten Mal gelesen, es kommt also nichts um.
  • Man kann auch stattdessen "readlines" (man beachte das "s" am Schluss) verwenden. Das versucht, alle Zeilen auf einmal zu lesen und in einer Liste von Zeichenketten abzulegen. Das ist aber nur bei nicht allzugroßen Dateien und genügend Arbeitsspeicher empfehlenswert. Auch hier kann man angeben, welche Bytezahl insgesamt nicht überschritten werden sollte.
  • Entsprechend kann man mit "writelines()" eine Liste von Zeichenketten rausschreiben. Die Prozedur erzeugt keine Zeilenwechselzeichen, die muss man selbst hinzufügen.
Einer alten UNIX-Philosophie zufolge sind Bildschirm und Tastatur auch Dateien. Wollen wir wetten, dass das geht? Die vorherige Übung noch mal:

import sys

diese = open ("dateien1.py", "r")

while 1:
        zeichen = diese.read(1)
        if not zeichen:
                break
        sys.stdout.write(zeichen)
diese.close()

Ging doch gut, was? Man beachte, dass "stdout" (die Bildschirmausgabe) nicht geöffnet und geschlossen werden muss!

Anwendungsbeispiel

Auswertung einer Systemdatei
Nun ein etwas komplexeres Beispiel. Für ein Programm sollen die vom System verwendeten Protokollnummern gelesen und in einem Dictionary gespeichert werden. Betrachten Sie die Datei "protocols". Sie enthält Kommentarzeilen, die wie in Python mit einem Gartenzaun beginnen. Auch Leerzeilen (oder enthalten sie Leerzeichen?) sind zu sehen. Die eigentlichen Informationen stehen in den anderen Zeilen, die stets den gleichen Aufbau haben: Protokoll in Kleinbuchstaben, die Protokollnummer, das Protokoll noch mal in Großbuchstaben und ein Kommentar. Uns interessieren die ersten beiden Spalten. Schauen Sie dazu in die Python-Programmdatei "test_sysprot.py" und in die Datei, die gelesen werden soll "protocols".

[ Übersicht | vorige Seite | Ganz oben ]

©   W. Arnhold Oktober 2000