2015-10-17 3 views
7

Ich versuche, die folgenden, in dieser Reihenfolge zu tun:macht os.walk Arbeit in eine Nicht-Standard-Weise

Verwenden os.walk(), um jedes Verzeichnis nach unten gehen.
Jedes Verzeichnis hat subfolders, aber ich interessiere mich nur für die erste subfolder. So sieht das Verzeichnis wie folgt aus:

/home/RawData/SubFolder1/SubFolder2 

Zum Beispiel. Ich möchte in RawData2 Ordner haben, die auf der SubFolder1-Ebene anhalten.

Die Sache ist, es scheint wie os.walk() geht durch den gesamten RawData Ordner, und ich bin mir nicht sicher, wie man es stoppen kann.

Das Unten ist, was ich bis jetzt habe - ich habe eine Anzahl anderer Kombinationen des Ersatzes von variablen Verzeichnissen für Wurzel oder Dateien versucht, aber das scheint mich nicht zu bekommen, was ich will.

import os 

for root, dirs, files in os.walk("/home/RawData"): 

    os.chdir("/home/RawData2/") 
    make_path("/home/RawData2/"+str(dirs)) 
+0

Es ist nicht klar, dass, was Sie meinen, können Sie mehr erklären? – Kasramvd

+0

Nun, os.walk() durchläuft alle Ebenen von RawData und die zugehörigen Unterordner. Ich bin daran interessiert, dass es nur eine Ebene hinunter geht, anstatt alle. Vielleicht wäre eine andere Funktion angemessener? –

+0

Vielleicht wäre [glob] (https://docs.python.org/3.4/library/glob.html#module-glob) eine sinnvolle Alternative? – swenzel

Antwort

1

Ich schlage vor, Sie stattdessen glob verwenden.

Als Hilfe bei glob beschreibt:

glob(pathname) 
    Return a list of paths matching a pathname pattern. 

    The pattern may contain simple shell-style wildcards a la 
    fnmatch. However, unlike fnmatch, filenames starting with a 
    dot are special cases that are not matched by '*' and '?' 
    patterns. 

Also, Ihr Muster an jedem ersten Level-Verzeichnis ist, was ich denke etwas so sein würde:

/root_path/*/sub_folder1/sub_folder2 

Also, Sie starten An deiner Wurzel bekommst du alles in dieser ersten Ebene und dann nach sub_folder1/sub_folder2 suchen. I denke, das funktioniert.

Um es alle zusammen:

from glob import glob 

dirs = glob('/root_path/*/sub_folder1/sub_folder2') 

# Then iterate for each path 
for i in dirs: 
    print(i) 
+0

Die Sache ist, ich brauche sub_folder2, um etwas zu sein, das über eine Reihe von verschiedenen Ordnern iteriert. Ich bin mir nicht sicher, ob Ihre Methode das tun würde. –

+0

Sie sagen also, dass Sie alle Unterverzeichnisse der gefilterten Übereinstimmung durchsuchen möchten? Also, wenn Sie/root_path/*/sub1/sub2 herausgefiltert haben. Dann möchtest du jedes von denen nehmen und jedes von ihnen für alles andere in diesen Wegen iterieren? – idjaw

1

Vorsicht: Dokumentation für os.walk sagt:

das aktuelle Arbeits nicht ändern Verzeichnis zwischen Wiederaufnahmen von Fuß(). zu Fuß() ändert sich nie das aktuelle Verzeichnis, und geht davon aus, dass seine Anrufer nicht entweder

tut so sollten Sie os.chdir("/home/RawData2/") im walk Schleife vermeiden.

Sie können ganz einfach fragen walk nicht rekursiv durch topdown=True mit und Clearing dirs:

for root, dirs, files in os.walk("/home/RawData", True): 
    for rep in dirs: 
     make_path(os.join("/home/RawData2/", rep) 
     # add processing here 
    del dirs[] # tell walk not to recurse in any sub directory 
+0

Ich werde das in einem Moment versuchen. Ich werde darüber berichten, wie es läuft. –

+0

Nun, das ist besser, da es jetzt den "SubFolder1" erzeugt, aber es erzeugt immer noch alle Ordner auf der Ebene von SubFolder2. –

+0

@ ZR: Ich hätte es testen sollen. Eine Liste ist ein veränderbares Objekt, aber 'l = []' ändert nicht die ursprüngliche Liste, sondern macht nur den Referenzpunkt auf eine leere Liste. Es sollte "del l [:]" sein. Beitrag bearbeitet –