zwei Verzeichnisse zusammenfassen

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
Kombifahrer
User
Beiträge: 8
Registriert: Montag 5. Mai 2014, 23:16

hallo zusammen,
gibt es eigentlich für den unten aufgeführten Code eine elegantere Lösung, wie mit try u. except block??
Hintergrund ist,
das ich eine bestimmte Datei in zwei Verzeichnissen suche, dies mal da und mal hier sein kann,
darauf muss ich in einem Haupt Skript öfter zugreifen

Danke!! :roll:

Code: Alles auswählen

import os
verz_1='path'
verz_2='path'

liste1=os.listdir(verz_1)
liste2=os.listdir(verz_2)
liste=liste1+liste2

for dat in liste:
    if dat.endswith('.txt'):
        print (dat)
        try:
            i=open(verz_1+dat)
            line=i.readlines()
            print(line)
            i.close
        except:
            i=open(verz_2+dat)
            line=i.readlines()
            print(line)
            i.close    
BlackJack

@Kombifahrer: Statt Listen ohne kompletten Pfad zu erzeugen und die dann in einer Liste zusammen zu werfen, um dann hinterher über eine Ausnahmebehandlung wieder zu versuchen herauszufinden aus welchem der beiden Pfade der Dateiname eigentlich stammte, könntest Du den Pfad gleich an die Elemente in den jeweiligen Listen vorn anfügen und damit hast Du das Problem gar nicht erst.

Da hier nach einem bestimmten Namensmuster gefiltert wird, bietet sich auch das `glob`-Modul an — das liefert die kompletten Pfade.

Sonstige Anmerkungen:

Keine nackten ``except``-Anweisungen verwenden. Immer angeben welche Ausnahmen man überhaupt erwartet. Das fällt einem sonst irgendwann mal auf die Füsse weil sich ein Programm nicht so verhält wie man erwartet, weil eine unerwartete Ausnahme vom Programm „behandelt” wird, und man sie nie zu Gesicht bekommt. Solche Fehler sind dann nur sehr mühsam zu suchen und zu finden.

Dateien sollte man wieder schliessen. Dazu reicht es nicht die `close()`-Methode nur zu referenzieren, man muss sie auch *aufrufen*. Am besten man verwendet `open()` im Zusammenhang mit der ``with``-Anweisung.


`i` für etwas anderes als ganze Zahlen zu verwenden ist selten eine gute Idee. Fast alle Programmierer denken wenn sie `i` und `j` sehen, an ganzzahlige Variablen.

`line` ist ein guter Name für *eine* Zeile, aber nicht für eine Liste mit vielen Zeilen.

Ebenfalls nicht schön sind nicht allgemein bekannte Abkürzungen bei Namen oder durchnummerierte Namen. Ersteres zwingt den Leser zum rätselraten, und das geht dann auch schon mal daneben und erschwert damit unnötig das Verständnis. Und wenn man anfängt Namen durchzunummerieren ist das häufig ein Zeichen das man eigentlich eine Datenstruktur für die Werte verwenden möchte. Oft ist das eine Liste.

Leerzeichen um das ``=`` bei Zuweisungen (ausserhalb von Argumentlisten) und um binäre Operatoren erhöht die Lesbarkeit.

Pfade setzt man mit `os.path.join()` zusammen und nicht mit ``+``. Das ist robuster, funktioniert zum Beispiel auch wenn `verz_1` nicht mit einem Pfadtrenner endet, und plattformunabhängig, das heisst es wird automatisch der für die Plattform passende Pfadtrenner verwendet.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

vermeide Code-Verdopplungen:

Code: Alles auswählen

import itertools
import glob
import os

def main():
    paths = ['path1', 'path2']
    filenames = itertools.chain(*(glob.iglob(os.path.join(path, '*.txt')) for path in paths))
    for filename in filenames:
        print(filename)
        with open(filename) as lines:
            lines = list(lines)
            print lines

if __name__ == '__main__':
    main()
Antworten