2017-12-23 11 views
1

Ich bin ein Python Anfänger und auf der Suche nach etwas Hilfe beim Durchsuchen einer Liste von Verzeichnissen mit os.walk.Python - Os.walk Schleife durch Liste der Verzeichnisse in verschiedenen Laufwerken

Die Idee ist, dass ich eine Liste von Verzeichnissen aus einer SQL-Datenbank ziehen, diese Verzeichnisse werden wahrscheinlich unterschiedliche Laufwerkbuchstaben oder sogar einen UNC-Pfad haben. Was ich tun muss, ist durch diese Verzeichnisse zu suchen, um eine Datei mit einem bestimmten Namen zu finden und zu löschen. Da sich die Datei in einem der Verzeichnisse befinden kann, muss sie alle durchsucht werden. Die Liste der Verzeichnisse ist unbestimmt, so dass ich dachte, sie in einer Liste zu speichern und os.walk alle Verzeichnisse in dieser Liste anzeigen zu lassen.

def get_location(): 
    c.execute('SELECT ADDRESS FROM DIRECTORY') 
    data = c.fetchall() 
    SQLlist = [row for row in data] 
    return SQLlist 


addresslist = get_location() 


def FileDeleter(): 
    for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False) for path in (str(addresslist[0:]))): 
     for file in files: 
      if correctID in file: 
       if file.endswith('.custextn'): 
        os.remove(os.path.join(root, file)) 

Dies ist, wie der Code zur Zeit steht, aber bisher habe ich versucht:

for root, dirs, files in os.walk(addresslist[0:], topdown=False): 

    for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False)): 

Es scheint, dass os.walk zu sein nicht Listen akzeptieren (/ Tupel). Wenn ich Adressliste [0] oder Adressliste [1] setze, funktioniert es tatsächlich, aber da ich nicht weiß, wie viele Adressen es möglicherweise gibt, kann ich leider nicht einfach X Adressen als separate Variablen speichern und die Funktion duplizieren.

Der Fehler erhalte ich, wenn mein Code ausgeführt ist:

‚Typeerror: erwartete str, Byte oder os.PathLike Objekt, nicht auflisten‘

Schließlich habe ich mit einer hartcodierte Liste von Adressen getestet nur regieren ein Problem aus mit, wie die Liste aus der Datenbank, beispielsweise extrahiert wird:

addresslist = ['C:\\Subfolder1\\Subfolder2', 'D:\\Subfolder1\\Subfolder2'] 

und wegen Auspacken Fehler:

x,y = ['C:\\Subfolder1\\Subfolder2', 'D:\\Subfolder1\\Subfolder2'] 

Danke

+1

Wickeln Sie es in eine andere for-Schleife, um die Elemente der 'Adressliste' einzeln zu bearbeiten. Vielleicht verschieben Sie es zu einer zusätzlichen Funktion, um eine zu tiefe Verschachtelung von Loops zu vermeiden. –

+0

Vielen Dank, ich verstehe die Verschachtelung, also habe ich versucht, eine Schleife außerhalb zu erstellen, die beide Orte gut druckt, aber wenn ich es zurücksetze und die Variable drucke, bekomme ich nur den ersten Eintrag der Liste. Ersetzen dieser neuen Variable in dem Code, wo "Adressliste [0:] war, scheint nichts zu entfernen – Meshi

Antwort

0

Ich habe das jetzt funktioniert und wollte bestätigen, was ich getan habe.

Es gab zwei Probleme. Ich brauchte die zusätzliche for-Schleife, vorgeschlagen von @ TheF1rstPancake und @Michael Butscher.

Das zweite Problem bestand darin, die Liste der Verzeichnisse aus der Datenbank zu extrahieren.

def get_location(): 
    c.execute('SELECT ADDRESS FROM DIRECTORY') 
    data = c.fetchall() 
    SQLlist = [row for row in data] 
    return SQLlist 

ich die oben aber gefunden wurde unter Verwendung beim Drucken (Daten) bekam man ein Tupel von Tupel oder eine Liste von Tupeln, die es wurde durch eine Schleife andernfalls für os.walk zu verwenden. Das Ergebnis sah aus wie

[('C:\\Subfolder1\\Subfolder2',), ('D:\\Subfolder1\\Subfolder2',)] 

Die Lösung, die ich verwenden unter

def get_location(): 
    c.execute('SELECT ADDRESS FROM DIRECTORY') 
    data = c.fetchall() 
    SQLlist = [] 
    for row in range(len(data)): 
     SQLlist.append(data[row][0]) 
    return SQLlist 

Das gibt mir jetzt die Liste:

['C:\\Subfolder1\\Subfolder2', 'D:\\Subfolder1\\Subfolder2'] 

Wenn diese Liste durch die zusätzlichen Lauf für Schleife os.walk Durchsucht nun alle Verzeichnisse korrekt.

Vielen Dank für die Hilfe von allen, wirklich zu schätzen!

0

Ihre erste for-Schleife macht nicht, was Sie wollen. Es ist nah, aber nicht ganz.

for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False) for path in (str(addresslist[0:])))

Was ist Ihre Schleife derzeit tun, ist Ihre addresslist in einen String zu konvertieren. Dann durchlaufen Sie tatsächlich jedes Zeichen in dieser Zeichenfolge, das in die Variable path eingegeben wird. Dann versuchen Sie eine Reihe von os.walk Generatoren zu verketten. Aber os.walk benötigt einen einzelnen Pfad. Sie verwenden diese Variable path auch nicht an einer anderen Stelle in Ihrem Code.

sollte sein:

for path in addresslist: 
    # it looks like you are worried that not all paths will be strings 
    # if that's really a concern, then leave this next line. 
    # Otherwise, I think it is safe to delete it 
    path = str(path) 
    for root, dirs, files in os.walk(path, topdown=False): 

, dass jedes Element von addresslist nehmen (das ist der Weg, den Sie suchen möchten ist) und ein os.walk über es zu tun. Ich glaube nicht, dass Sie hier überhaupt chain verwenden müssen.

Wenn Sie chain verwenden möchten (was nicht notwendig ist), können Sie die Gliederung dieses SO-Posts befolgen: os.walk multiple directories at once.

for root, dirs, files in chain.from_iterable(os.walk(str(path)) for path in addresslist): 

Eine weitere Sache, die Sie tun sollten, ist, haben addresslist ein Parameter sein, die in Ihre Funktion übergeben wird.

def FileDeleter(addresslist): 
    # your function code here 
# then you need to actually call the function 
addresses = get_locations() 
FileDeleter(addresses) 

Wenn Sie sich auf globale Variablen verlassen, können Sie eine Menge Ärger bekommen, wenn Ihr Code komplexer wird.

+0

Hallo, vielen Dank für Ihre Kommentare. Ich habe beide Vorschläge ausprobiert, aber immer noch kein Glück. Bei Verwendung dieser Methode (ohne path = str (path)) erhalte ich den Fehler 'TypeError: expected str, bytes oder os.PathLike object, not tuple', wenn bei der Umwandlung in eine Zeichenkette nichts ausgeführt wird. – Meshi

+0

@Meshi Ein 'print (repr (path))' als erste Zeile in der for-Schleife zeigt, was 'path' wirklich ist. –

+0

Stimmen Sie hier mit @MichaelButscher überein. Sind Sie auch sicher, dass die von 'get_locations' zurückgegebenen Daten tatsächlich eine Liste von Pfaden sind? – TheF1rstPancake

Verwandte Themen