2016-06-05 9 views
2

Ich bin neu in Python und verwende es, um einige Daten zu analysieren.Python: Skript in allen Unterverzeichnissen ausführen

Mein Problem ist folgendes: Ich habe ein Verzeichnis mit vielen Unterverzeichnissen, von denen jedes eine große Anzahl von Dateien enthält.

Ich habe bereits ein Python-Skript geschrieben, das, wenn es in einem dieser Unterverzeichnisse ausgeführt wird, die Datenanalyse durchführt und es in eine Ausgabedatei schreibt. Das Skript enthält einige Shell-Befehle, die ich unter Verwendung von os.system() aufrufen kann, also muss ich in einem der Unterverzeichnisse "sein", damit es funktioniert.

Wie kann ich schreiben eine Funktion, die automatisch:

  1. Moves in das erste Unterverzeichnis
  2. führt das Skript
  3. geht zurück auf das übergeordnete Verzeichnis und wechselt zum nächsten Unterverzeichnis

Ich denke, dass dies in irgendeiner Weise mit os.walk() getan werden könnte, aber ich habe nicht wirklich verstanden, wie es funktioniert.

PS Ich bin mir der Existenz von this post bewusst, aber es löst nicht mein Problem.

PPS Vielleicht sollte ich darauf hinweisen, dass meine Funktion den Verzeichnisnamen nicht als Argument verwendet. Eigentlich braucht es kein Argument.

+0

[Wie kann ich „cd“ in Python?] (Http://stackoverflow.com/q/431684/794749) –

+0

Code Teile – Tanu

Antwort

1

in Ihr Arbeitsverzeichnis in Python ändern Sie brauchen:

os.chdir(your_path) 

können Sie dann Ihr Skript rekursiv ausgeführt werden.

Beispielcode:

import os 

directory_to_check = "your_dir" # Which directory do you want to start with? 

def my_function(directory): 
     print("Listing: " + directory) 
     print("\t-" + "\n\t-".join(os.listdir("."))) # List current working directory 

# Get all the subdirectories of directory_to_check recursively and store them in a list: 
directories = [os.path.abspath(x[0]) for x in os.walk(directory_to_check)] 
directories.remove(os.path.abspath(directory_to_check)) # If you don't want your main directory included 

for i in directories: 
     os.chdir(i)   # Change working Directory 
     my_function(i)  # Run your function 

Ich weiß nicht, wie Ihr Skript funktioniert, weil Ihre Frage ganz allgemein ist, so deshalb kann ich nur eine allgemeine Antwort geben ....

Aber ich denke, was Sie brauchen, ist:

  1. alle Unterverzeichnisse Erhalten und speichern sie mit os.walk
  2. ändern Arbeits Verzeichnis mit os.chdir

os.walk alleine funktioniert nicht

Ich hoffe, das hilft! Viel Glück!

+0

Aber auf diese Weise bleibe ich im ersten Unterverzeichnis bei der ersten Iteration und ich bekomme "[Errno 2] Keine solche Datei oder Verzeichnis: Unterverzeichnisname". Es sollte nach der Ausführung der Funktion in das übergeordnete Verzeichnis zurückgehen ... – valerio

+0

Ja. Deshalb habe ich erwähnt, dass Sie absolute Pfade brauchen ... Ich habe den Code so aktualisiert, dass er Ihren Bedürfnissen entspricht :) – ant0nisk

+0

Ok, ich musste "__file__" mit Anführungszeichen schreiben, damit diese Zeile funktioniert (sonst bekomme ich "name '__file__ "ist nicht definiert"), aber es funktioniert! Bis auf eine Sache ... aus irgendeinem Grund wird der absolute Pfad zum übergeordneten Verzeichnis in die Liste "Verzeichnisse" aufgenommen. Wie kann ich das vermeiden? – valerio

0

Dies würde so gemacht werden.

for dir in os.listdir(your_root_directory): 
    yourFunction(dir) 

Die os.listdir Methode gibt die Liste der Verzeichnisse im Stammverzeichnis nur.

Die os.walk Methode jedoch durchläuft die Verzeichnisse rekursiv, was es für andere Dinge nützlich macht und os.listdir könnte besser sein.

jedoch aus Gründen des completenes, hier ist eine os.walk Option:

for dir in next(os.walk(your_directory))[1]: 
    yourFunction(dir) 

Beachten Sie, dass die os.walk ein Generator ist, damit der nächste Anruf. Der erste nächste Aufruf, erzeugt einen Tupel-Stamm, Verzeichnisse, Dateien. Und die Wurzel in diesem Fall ist Ihr Verzeichnis. Sie sind nur an dir interessiert - die Liste der Unterverzeichnisse, also indexieren Sie [1].

+0

Vielleicht sollte ich spitze dies aus, aber meine Funktion nimmt den Verzeichnisnamen nicht als Argument. Eigentlich braucht es kein Argument. – valerio

+0

Nun, es sollte nicht schwer sein, es so zu machen. Andernfalls müssten Sie Globals verwenden, was eine schlechte Form für Python ist. Eine Funktion machen einen Ordner, in dem es als Argument fungiert, ist die Modularität für. Damit Sie es bei anderen Gelegenheiten wiederverwenden können. – SirSteel

+0

Warum verwendet Globals schlechte Form für Python? –

1

os.walk sollte perfekt funktionieren für das, was Sie tun möchten. Lassen Sie sich mit diesem Code gestartet, und Sie sollten sehen, was Sie tun müssen:

import os 
path = r'C:\mystartingpath' 

for (path, dirs, files) in os.walk(path): 
    print "Path:", path 

    print "\nDirs:" 
    for d in dirs: 
     print '\t'+d 

    print "\nFiles:" 
    for f in files: 
     print '\t'+f 

    print "----" 

Was wird dieser Code tun zeigen Ihnen mit, dass os.walk wird durch alle Unterverzeichnisse des gewählten Ausgangspfad durchlaufen. In jedem Verzeichnis können Sie den vollständigen Pfad zu jedem Dateinamen abrufen, indem Sie den Pfad und den Dateinamen verketten. Beispiel:

path_to_intersting_file = path+'\\'+filename 

# (This assumes that you saved your filename into a variable called filename) 

Mit dem vollständigen Pfad zu jeder Datei können Sie Ihre Analyse durchführen, während Sie in der os.walk for-Schleife sind. Fügen Sie Ihren Analysecode hinzu, damit die for-Schleife mehr als nur Inhalte drucken kann.

0

Wenn Sie eine bestimmte Aktion für jeden Unterordner eines Ordners ausführen möchten, besteht eine Möglichkeit darin, eine rekursive Funktion zu schreiben und jedes Verzeichnis einzeln zu bearbeiten. Ich hoffe, mein Beispiel ein wenig hilft: http://pastebin.com/8G7JzcQ2

+0

Bitte füge den Code zu deiner Antwort hinzu. Siehe [Wie formatiere ich meine Code-Blöcke?] (Http://meta.stackexchange.com/questions/22186/how-doi-i-format-my-code-blocks) – Tone

Verwandte Themen