2016-03-31 4 views
0

Ich möchte ein Verzeichnis durchsuchen und nach einer bestimmten Datei suchen. Hier ist ein Code schrieb ich:os.walk ein Pfad mit Platzhalter

import os 
def find(filename, path): 
    for root, dirs, files in os.walk(path): 
    for file in files: 
     if file==filename: 
     print(os.path.join(root, file)) 

# Python boiler plate call. 
if __name__ == "__main__": 
    find('myFile.txt', '/path/to/one/user/dir/and/subDir1/and/subDir2') 

Die oben genannten Arbeiten ziemlich gut.

Question1: Wie mein Code zu verbessern, mit so etwas wie dies funktioniert:

find('myFile.txt', '/path/to/one/*/dir/and/*/and/*') 

Question2: Was ist der Pythonic Weg:

 if file==filename: 

Antwort

2

In Bezug auf question1:

Sie fragen nach einem Glob-Ausdruck. Beachten Sie, dass der von Ihnen gepostete Ausdruck nicht unbedingt eindeutig ist, sodass er mehrere Verzeichnisse (und Dateien) abgleichen kann. Um diese Dateien/Verzeichnisse, können Sie die Verwendung glob module

import glob 
for result in glob.iglob('/path/to/one/*/dir/and/*/and/*'): 
    find('myFile.txt', result) 

Ich nehme an, dass Sie vielleicht prüfen, ob result ist ein Verzeichnis, bevor Sie versuchen, eine Datei darin zu finden ... (os.path.isdir(result))


zu Frage 2:

ich glaube, Sie wollen wahrscheinlich nur wissen, ob die Datei die Sie suchen in Dateien und dann/yield den vollständigen Pfad drucken:

Es gibt nichts "unpythonic" über das Schreiben if x == y - Es ist eigentlich ziemlich üblich. In Ihrem Fall mussten Sie das jedoch nicht wirklich tun. Die pythonische Sache ist, eingebaute Operatoren zu verwenden, um nach dem gewünschten Objekt in der Liste zu suchen und die Ausgabe einfach darauf aufzubauen, ob Sie etwas gefunden haben oder nicht. Auch deutete ich es oben, aber es ist oft schöner (und wiederverwendbare) zu yield die Ergebnisse und nicht nur sie zu drucken:

def find(filename, path): 
    for root, dirs, files in os.walk(path): 
    if filename in files: 
     yield os.path.join(root, filename) 

Jetzt können Sie es in den Anrufern drucken (oder andere Dinge tun mit ihm ...):

for filename in find(needle, haystack): 
    print(filename) 
+0

Hallo @mgilson. Wunderbar, genau das, was ich wollte. Vielen Dank ! – Riad

0

Hier ist der Code eneded ich mit @mgilson asvice

import os 
import glob 
# Function to find the file 
def find(filename, path): 
    for root, dirs, files in os.walk(path): 
    if filename in files: 
     yield os.path.join(root, filename) 

# Python boiler plate call. 
if __name__ == "__main__": 
    # build path expression 
    projectUserSimDirs=os.environ['LINUX_VAR']+'/path/to/one/*/dir/and/*/and/*' 
    # traverse the path 
    for result in glob.iglob(projectUserSimDirs): 
    # Check is it is a valid dir 
    if os.path.isdir(result): 
     # Search for files 
     for filename in find('myFile.txt', result): 
     print(filename) 

Schreiben up Fühlen sie sich frei anhängen