2017-12-17 1 views
3

Angenommen, ich einen Verzeichnisbaum wie diese:Liste aller Dateien in einem Unterverzeichnis von einem gegebenen Startverzeichnis

a/ 
├── b 
│   ├── d.png 
│   └── e 
│    └── f.png 
└── c.png 

Meine gewünschte Ausgabe ist: wenn ich nach Dateien in a/b/ suchen möge: b/d.png & b/e/f.png

und bei a/: a/c.pnga/b/d.pnga/b/e/f.png

Ich weiß, wie man alle Dateien in einem Unterverzeichnis mit os.walk auflistet und ich habe viel nach einer ähnlichen Situation wie meiner gesucht, aber ich habe keine gefunden.

Hier ist mein letzter Versuch:

path = "a/b" 
pathBase = os.path.basename(path) 

for p, dirs, files in os.walk(path): 
    for file in files: 
     print(os.path.join(p.replace(path, pathBase),file)) 

während dies mit a/b/ wie erwartet funktioniert es nicht mit a/ funktioniert.

Ausgabe für a ist: c.pngb/d.pngb/e/f.png was nicht wie erwartet ist.

+0

"Es funktioniert nicht." bedeutet genau? –

+0

Ich habe meinen ursprünglichen Post mit Ausgabe für 'a /' –

Antwort

2

Ihr Code wird (fast) richtig sein, wenn Sie den Schrägstrich von path abzustreifen, aber in jedem Fall sollten Sie os.path.relpath verwenden, um die relativen Dateipfade zu berechnen:

import os 

def f(path): 
    path = path.rstrip(os.sep) 
    parent = os.path.dirname(path) 
    for p, dirs, files in os.walk(path): 
     for file in files: 
      print(os.path.relpath(os.path.join(p, file), parent)) 

Für das, was es wert ist, pathlib Marken Pfadmanipulation einfacher:

from pathlib import Path 

def f(path): 
    path = Path(path) 
    for x in path.rglob('*'): 
     if not x.is_dir(): 
      print(x.relative_to(path.parent)) 
+0

editiert Die Ausgabe für 'path =" a/"' ist immer noch 'c.png' etc, nicht' a/c.png' Hier bleibe ich bei –

+0

stecken Aha! Nach dem Bearbeiten funktioniert das jetzt wie erwartet. Aber können Sie ein wenig mehr erklären, warum das Abtragen des Pfades in der richtigen Antwort resultiert? –

+1

@JonasEphrem In Ihrem ursprünglichen Code ersetzten Sie das Vorkommen von 'path' durch' os.path.basename (path) ', was eine leere Zeichenfolge für' path = 'a /' 'zurückgibt. Wir könnten den abschließenden Schrägstrich entfernen, um sicherzustellen, dass der Name immer nicht leer ist. OTOH für diesen 'path'' os.path.dirname' hat '' a'' zurückgegeben, als ich eine leere Zeichenfolge erwartet habe, und das Entfernen von nachfolgenden Schrägstrichen löst das ebenfalls. Sie können ['os.path.normpath'] (https://docs.python.org/3/library/os.path.html#os.path.normpath) verwenden, um die vollständige Pfadnormierung (und nicht nur einen Teil) durchzuführen von diesem Prozess). – vaultah

Verwandte Themen