Announcement

Collapse
No announcement yet.

Python-Tipp: Flexible Dateiverarbeitung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Python-Tipp: Flexible Dateiverarbeitung

    Das Python eine leitungsfähige Sprache ist, muss nicht mehr bewiesen werden. Insbesondere
    die effizienten IO/Dateiverarbeitungs-Moeglichkeiten vereinfachen die Arbeit des Entwicklers ungemein.
    Apropos Dateien: die Python-Schnittstellen zur Dateiverarbeitung sind nicht allein auf rein physische Dateien beschraenkt, sondern arbeiten mit jedem Objekt gut zusammen, welches die erwarteten Schnittstellen zur Verfügung stellt.

    Der folgende Tipp geht auf ein Beispiel von Mark Lutz (der Autor von Learning Python und Programming Python, beide Bücher sind im OReilly-Verlag erschienen )zurueck.

    Es ist schon eindrucksvoll, wie man mit wenigen Zeilen Code schnell (!) zu effektiven Ergebnissen kommt. Los geht es. Zuerst wird ein kleines Modul mit dem Namen <i>mymod.py</i> erzeugt.
    <PRE>
    #!/usr/bin/env python

    def scanner(FP, linehandler):
    for line in FP.readlines():
    linehandler(line)
    </PRE>
    Die Funktion <i>scanner()</i> ist eine wiederverwendbare Software-Komponente. Sie erhaelt zwei Parameter: das File-Objekt <i>FP</i> sowie das Funktions-Objekt <i>linehandler</i>. So
    weit, so gut.

    Auf den ersten Blick sieht das alles nicht besonders aufregend aus. Und vor allem, was kann man damit machen? Nun, wenn Sie diese Funktion in ein Modul importieren, faellt die vielseitige Verwendbarkeit sofort ins Auge. Das untenstehende Beispiel verdeutlicht das Gesagte:
    <PRE>
    #!/usr/bin/env python

    from mymod import scanner

    def getFirstWord(line):
    print line.split()[0]

    if __name__ == '__main__':

    FP = open('afile')
    scanner(FP, getFirstWord)
    </PRE>
    Sieht schon viel besser aus. Aber das war noch nicht alles. In Beispiel #2 wird der Aktionsradius erweitert (eingedenk der Bemerkungen am Anfang des Beitrages). Aufgepasst:
    <PRE>
    #!/usr/bin/env python

    from mymod import scanner

    class Stream:
    def readlines(self):
    return ['a\n', 'b c d\n']

    def getFirstWord(line):
    print line.split()[0]

    if __name__ == '__main__':

    obj = Stream()
    scanner(obj, getFirstWord)
    </PRE>
    Dieses Beispiel (dasselbe waere mit StringIO moeglich) zeigt, wie flexibel man in der Tat mit einer Funktion wie <i>scanner()</i> in Python arbeiten kann.

    Wie gesagt, solange die passenden Schnittstellen angeboten werden, gibt es keinerlei Probleme. Da muss der Leser doch unweigerlich zum Python-Fan werden, oder?

    Viel Spass.

    Thomas Kaufmann
Working...
X