with open in if clause

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
chwin
User
Beiträge: 16
Registriert: Freitag 4. Juli 2014, 15:07

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:
            ...
Das Leben ist wie ein Tennisball.
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. ;-)
chwin
User
Beiträge: 16
Registriert: Freitag 4. Juli 2014, 15:07

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 :-)
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.
Antworten