Seite 1 von 1

with open in if clause

Verfasst: Freitag 4. Juli 2014, 15:20
von chwin
Hallo

ich bin neu hier und fange an mit Python zu arbeiten.

Ich benutze es hauptsächlich als Perl Ersatz um alltägliche Adminaufgaben zu automatisieren.

Mein problem zzt:

Ich habe ein script das sehr große Textdateien mit diversen regex durchkämmt und auswertet.

Die Dateien sind durchaus im zweistelligen GB Bereich.

Da die Files so groß sind, sind wir dazu übergegangen die Files mit bzip zu packen.

Mein Parser soll beide Typen lesen können, also plain und bzip


was ich grad versuche:

Code: Alles auswählen

def f_identfy_line(filename,type="plain"):
    if type == "plain":
        ff ="with open(filename,'r') as tmp_spn_list_txt:"
    elif type == "bz2":
        ff = "with bz2.BZ2File(filename,'r') as tmp_spn_list_txt:"
    

            anothther_line = True
            count = 0
            while anothther_line:
            line = tmp_spn_list_txt.readline()
            ...
egal wie ich den Block einrücke, es geht nicht.
Lagsam vermute ich, das es so nicht funktioniert.
Gibt es für diesen Zweck eine einfache Lösung?

Mit Polymorphie und Objekten gehts bestimmt, aber Objekt sind nicht so meine Welt.
Ich bin Admin und kein Programmierer :-)

Die einfachste Lösung ist sicher Die Funktion komplett 2 mal zu haben, aber dann muss ich immer an zwei Stellen den Code pflegen.

Schon mal vielen Dank


Gruss
Christain

Re: with open in if clause

Verfasst: Freitag 4. Juli 2014, 15:24
von EyDu
Hallo und willkommen im Forum!

Code: Alles auswählen

def identfy_line(filename, format="plain"):
    opener = open if format == "plain" else bz2.BZ2File

    with opener(filename, "r") as fp:
        for line in fp:
            ...

Re: with open in if clause

Verfasst: Freitag 4. Juli 2014, 16:23
von BlackJack
@chwin: Psst, *alles* was in Python an einen Namen gebunden werden kann, also *jeder* Wert, ist in Python ein Objekt. Sogar Module, Klassen, Funktionen, und Methoden sind Objekte. Wenn Du keine Objekte magst, dann musst Du Python ganz schnell wieder vergessen. ;-)

Re: with open in if clause

Verfasst: Freitag 4. Juli 2014, 21:24
von chwin
Vielen Dank für die schnelle Antwort.

Es hat auf Anhieb funktioniert.

@BlackJack
Objekte nutzen, die von Leuten die wissen was sie tun programmiert wurden ist das eine.
Selber welche zu bauen... das andere :-)

Re: with open in if clause

Verfasst: Samstag 5. Juli 2014, 10:46
von BlackJack
@chwin: Es macht eventuell Sinn sich mal mit Iteratoren, iterierbaren Objekten, Generatorfunktionen (``yield``), und dem `itertools`-Modul zu beschäftigen. Damit kann man ähnliche Effekte erreichen wie mit Pipes in der Shell, also von einander unabhängige Funktionen die auf einem Datenstrom operieren, nur halt auf einer Folge von Objekten statt ausschliesslich Bytes die jedes Programm irgendwie interpretieren muss.

Zum Beispiel würde ich das lesen/erzeugen der Zeilen vom Verarbeiten trennen. Dann kann der `identify_line()`-Funktion egal sein wo die Zeilen nun genau herkommen, aus einer unkomprimierten Datei oder eine komprimierten, oder vielleicht aus einer Liste mit Zeilenwerten die zum Testen übergeben wurde.