Verzeichnisse aus Datei lesen und verarbeiten

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
The Bang 2
User
Beiträge: 14
Registriert: Montag 11. März 2013, 12:30

Guten Morgen zusammen,

ich habe hier ein kleines problem, mit dem ich aktuell nicht weiterkomme.
Ich habe hier eine Textdatei, die verschiedene Dateipfade enthält. Ich möchte diese einlesen und dann weiterverarbeiten:

Code: Alles auswählen

def read_konfig_file():
    """
    Liest Verzeichnispfade fuer NFS-Pfad aus Config-File aus
    """
    #Variablendeklarationen lokal
    konfigfile = "verzeichnis.konfig"
    #Variablendeklararation global
    global nfs_paths
    nfs_paths = []

    try:
        with open(konfigfile,'r') as nfs_konfig_file:
            for line in nfs_konfig_file:
                nfs_paths.append(line)
    except IOError:
        print("Kann Datei ",konfigfile,"in",os.getcwd(),"nicht finden")
        sys.exit()



def clean_nfs(path_to_clean, units_to_skip):
    """
    Loescht Ornder und Dateien, laesst aktuelle Dateien nach Wahl aus
    Parameter:
        path_to_clean: Zielverzeichnis
        units_to_skip: Anzahl der auszulassenden Dateien / Ordner
    """
    for path in nfs_paths:
        for name in os.listdir(path):
            #todo
Bei dem Befehlt os.listdir bekomme ich den Fehler, dass das Verzeichnis nicht auffindbar ist - die \-Trennzeichen werden durch // ersetzt. Ich weis, dass man bei Strings das ganze durch r"Pfad" umgehen kann. Gibt es eine ähnliche Möglichkeit auch für Listen bzw einen Workarround?

Vielen Dank schonmals für eure Hilfe :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Backslashes ( \ ) durch *zwei* Forwardslashes ( / ) zu ersetzen klingt nicht richtig. Bestenfalls durch einen.

Und am Ende ist es ganz simpel: in deiner Konfiguration steht ein Pfad, den es nicht gibt. Und in dieser Datei musst du auch nichts escapen - Dateiinhalte werden unveraendert eingelesen. In Python ist

Code: Alles auswählen

"\n\n"
ein String mit zwei Linefeeds/Zeilenumbruechen.

In einer beliebigen Textdatei ist derselbe Inhalt einfach nur zwei Bytes mit dem Wert 10. Da wird nichts interpretiert.
BlackJack

@The Bang 2: Der Pfad kann nicht gefunden werden weil die Zeilen aus der Datei Zeilenende-Zeichen am Ende haben, es aber normalerweise keine Pfade mit diesem Zeichen im Namen gibt. Das müsstest Du entfernen.

Es gibt in Python keine Variablendeklarationen und ``global`` solltest Du ganz schnell wieder vergessen und aus Deinen Programmen entfernen. Funktionen sollten nicht auf globalen Variablen operieren. Alles was eine Funktion verwendet (ausser Konstanten) sollte als Argument übergeben werden. Und wenn eine Funktion ein Ergebnis hat, dann wird das als Rückgabewert an den Aufrufer zurückgegeben.

`IOError` kann auch etwas anderes bedeuten als das eine Datei nicht gefunden werden kann, deshalb ist die Ausgabe in der Ausnahmebehandlung nicht korrekt.

Ein `sys.exit()` hat in einer Funktion die nicht mit dem Benutzer interagiert nichts zu suchen. Das nimmt dem Aufrufer alle möglichkeiten da irgendwie anders drauf zu reagieren. Zum Beispiel in dem die Funktion mit anderen Pfaden aufgerufen wird. Wenn Du die Ausnahmebehandlung an der Stelle einfach komplett weg lässt, hat das im Grunde fast den selben Effekt — das Programm wird abgebrochen wenn die Konfigurationsdatei nicht gelesen werden konnte.
The Bang 2
User
Beiträge: 14
Registriert: Montag 11. März 2013, 12:30

Vielen Dank für die konstruktiven Hinweise . :)

Die Zeilenumbrüche kann ich vermutlich mit einem Slice vor der Verarbeitung umgehen - werde ich heute mal ein wenig basteln. Wie meinst du das mit dem Rückgabewert an den Aufrufer? Könntest du vielleicht in einem Beispiel kurz erklären, wie das typischerweise zu handhaben wäre?

Vielen Dank für eure Hilfe :)
Sirius3
User
Beiträge: 17825
Registriert: Sonntag 21. Oktober 2012, 17:20

@The Bang 2: gemeint ist, dass alle Daten, die in Funktionen verwendet werden, über Parameter in die Funktion hinein und alle Ergebnis über return aus der Funktion hinausgeleitet werden. Und config_file schreibt man mit c.

Code: Alles auswählen

CONFIGFILE = "verzeichnis.konfig"

def read_config_file():
    """
    Liest Verzeichnispfade fuer NFS-Pfad aus Config-File aus
    """
    nfs_paths = []
    with open(CONFIGFILE, 'r') as nfs_config_file:
        for line in nfs_config_file:
            nfs_paths.append(line.rstrip())
    return nfs_paths

def clean_nfs(nfs_paths, path_to_clean, units_to_skip):
    """
    Loescht Ornder und Dateien, laesst aktuelle Dateien nach Wahl aus
    Parameter:
        nfs_paths: Verzeichnispfade
        path_to_clean: Zielverzeichnis
        units_to_skip: Anzahl der auszulassenden Dateien / Ordner
    """
    for path in nfs_paths:
        for name in os.listdir(path):
            #todo
Antworten