2016-09-22 6 views
0

Ich habe eine Menge Fragen mit diesem Problem gelesen, aber ich habe festgestellt, dass es aus vielen vielen Gründen passiert, und habe keine Antwort auf meine gefunden bestimmtes Problem. Die Sache ist, ich habe versehentlich einige Dateien gelöscht und Photorec verwendet, um sie wiederherzustellen (ich bin auf Ubuntu 16.04 Xenial). Das Problem ist, es hat 2600+ Ordner wiederhergestellt! Ich schreibe einen kleinen Dateicrawler, um die Dateien loszuwerden, die ich nicht brauche - die einzigen Dateien, die mich interessieren, sind .py, .jpg, .png und .mp3. Hier ist der Code auf meinen Crawler:Python - OSError: [Errno 2] Keine solche Datei oder Verzeichnis

import os 

path= 

for (path, dirs, files) in os.walk(path): 
    for name in files: 
     if name.endswith('.py') or name.endswith('.jpg') or name.endswith('.png') or name.endswith('.mp3'): 
      continue 
     else: os.remove(name) 

Ich definiere ‚Pfad‘ manuell, und ich habe einen Test gemacht, wo ich Teil der Pfade, Verzeichnisse und Dateien zu drucken, und es druckt, was ich will. Wenn Sie den folgenden Code ausführen, wird jedoch zurückgegeben:

OSError: [Errno 2] No such file or directory: 'f0272560.java' 

Ich nehme an, ist die erste Datei, die ich versuche zu entfernen. Ich vermute, dass es nach der Datei sucht, nachdem sie bereits gelöscht wurde. Hat das Sinn oder ist es etwas anderes, das den Fehler verursacht? Wie könnte ich das beheben?

Vielen Dank im Voraus!

+1

Sie übergeben den Dateinamen nur an os.remove() '. Sie sollten den vollständigen Pfadnamen übergeben. –

Antwort

1

Die fileslistyield ed von os.walk ist die unqualifizierten Namen der Dateien. Sofern sie sich nicht im Arbeitsverzeichnis befinden, kann sie nicht mit unqualifizierten Namen entfernen, da sie nicht wissen, wo sie zu finden sind. Wechsel:

os.remove(name) 

zu

os.remove(os.path.join(path, name)) 

so passieren Sie einen qualifizierten Pfad zur Datei, nicht nur seinen Namen.

Side-Anmerkung: Während es funktioniert gut, wenn Sie nie die ursprüngliche Definition von path benötigen, ist es mit der pro-Schleife path von os.walk Überschreiben verwirrend sein kann. Möglicherweise möchten Sie den Namen eines davon ändern, indem Sie entweder die oberste Ebene in rootdir ändern oder den Namen der Schleifenvariablen in einen anderen Namen ändern (z. B. curdir).

+0

Vielen Dank! Es war unklar für mich, wie man richtig os.walk verwendet. – DarthDante

+0

@DarthDante: Yar, 'os.listdir' ist aus den gleichen Gründen verwirrend. Für 'os.listdir' empfehle ich, es durch' os.scandir' (3.5 oder höher nur leider; vor 3.5 zu ersetzen, Sie benötigen das PyPI-Paket 'scandir', um das Äquivalent' scandir.scandir' zu verwenden), wo die Einträge zurückgegeben werden ein '.name' Attribut für den nackten Namen und' .path' für den qualifizierten Pfad haben; Für 'os.walk' ist es keine schreckliche Idee, wenn die ersten zwei Zeilen innerhalb der' walk'-Schleife 'qdirs = [os.path.join (Pfad, d) für d in dirs] sind', 'qfiles = [ os.path.join (Pfad, f) für f in Dateien] 'so können Sie' qdirs'/'qfiles' für vorqualifizierte Pfade iterieren. – ShadowRanger

Verwandte Themen