2009-07-28 6 views
25

Ich suche nach einer guten Möglichkeit, relative Pfade von Dateien und (Sub-) Ordnern in einem bestimmten Ordner zu erhalten.Python - Holen Sie sich den relativen Pfad aller Dateien und Unterordner in einem Verzeichnis

Für meinen aktuellen Ansatz verwende ich os.walk(). Es funktioniert, aber es scheint nicht "Python" für mich:

myFolder = "myfolder" 
fileSet = set() # yes, I need a set() 

for root, dirs, files in os.walk(myFolder): 
    for fileName in files: 
     fileSet.add(root.replace(myFolder, "") + os.sep + fileName) 

Weitere Vorschläge?

Dank

+0

Was ist los mit os.walk? Es ist ein erstklassiger Teil der Bibliothek. –

+0

Nun, es ist nichts falsch daran denke ich. Aber es schien nicht so "richtig". Ich bin nicht vertraut mit Python und seiner Standard-Bibliothek, das ist ein Problem :) Aber alle Antworten gaben einige nützliche Vorschläge, wie ich mein Snippet verbessern kann. – vobject

Antwort

50

Verwenden Sie os.path.relpath(). Dies ist genau die beabsichtigte Verwendung.

import os 
rootDir = "myfolder" 
fileSet = set() 

for dir_, _, files in os.walk(rootDir): 
    for fileName in files: 
     relDir = os.path.relpath(dir_, rootDir) 
     relFile = os.path.join(relDir, fileName) 
     fileSet.add(relFile) 

Beachten Sie, dass os.path.relpath() wurde in Python hinzugefügt 2.6 und wird unter Windows und Unix unterstützt.

+0

Up für 'os.path.relpath()' anstelle von String-Manipulation. –

+0

Verwenden des Listenverständnisses (das schneller und pythonischer ist): 'files = [os.path.relpath (os.path.join (dirpath, file), rootDir) für (dirpath, dirnames, filenames) in os.walk (rootDir) für Datei in Dateinamen] ' – warownia1

2

Das ist wahrscheinlich der beste Weg, um ehrlich zu sein: Sie glob zu gehen, um eine bestimmte Anzahl von Schichten nach unten verwenden, aber wenn Sie es brauchen rekursive Sie müssen walk sein.

1

Was Sie tun, ist vollkommen richtig, und ich denke, sollte auf diese Weise getan werden, aber nur um alternative, hier ist ein Versuch,

import os 

def getFiles(myFolder): 
    old = os.getcwd() 
    os.chdir(myFolder) 

    fileSet = set() 

    for root, dirs, files in os.walk(""): 
     for f in files: 
      fileSet.add(os.path.join(root, f)) 

    os.chdir(old) 
    return fileSet 
3

Ich denke os.walk die richtige Wahl ist hier.
vielleicht root.replace(myFolder, "") sollte zu root.replace(myFolder, "", 1) wechseln, um mögliche etw. Zu vermeiden. Wissen Sie.
Wenn Sie bereits die Dateien und (Sub-) Ordner erhalten, ist auch os.path.commonprefix einen Blick wert.

+0

Danke für die Erwähnung des dritten Parameters für replace(). – vobject

+2

Verwenden Sie nicht '+ os.sep +', verwenden Sie 'os.path.join'. –

8
myFolder = "myfolder" 
fileSet = set() 

for root, dirs, files in os.walk(myFolder): 
    for fileName in files: 
     fileSet.add(os.path.join(root[len(myFolder):], fileName)) 
1

Sie können auch os.listdir() verwenden, wenn Sie nur für eine Alternative zu Ihrer Lösung zu suchen.

Aber im Grunde wird die Logik gleich bleiben: iterieren Sie über die Dateien - wenn Verzeichnis, durchlaufen Sie das Unterverzeichnis.

Verwandte Themen