2016-03-31 5 views
0

Хотелось бы пройти по каталогу и найти заданный файл. Вот код, который я написал:os.walk путь с подстановочным знаком

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') 

Выше работает очень хорошо.

Question1: Как улучшить свой код, чтобы работать с чем-то вроде этого:

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

question2: Что такое Pythonic способ:

 if file==filename: 

ответ

2

Что касается Question1:

Вы спрашиваете о глобусном выражении. Обратите внимание, что выражение, которое вы опубликовали, не обязательно уникально, поэтому оно может соответствовать нескольким каталогам (и файлам). Чтобы получить эти файлы/каталоги, вы можете использовать glob module

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

Я полагаю, что вы можете проверить, что result является каталогом, прежде чем пытаться найти файл в нем ... (os.path.isdir(result))


Что касается вопроса 2:

Я думаю, что вы, вероятно, просто хочу знать, если файл, который вы ищете in файлы, а затем распечатать/yield полный путь:

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

Нет ничего «непристойного» о написании if x == y - Это на самом деле довольно распространено. Однако в вашем случае вам действительно не нужно было это делать. Питоническая вещь заключается в том, чтобы использовать встроенные операторы для поиска объекта, который вы хотите в списке, и просто построить вывод, основываясь на том, что вы нашли что-то или нет. Кроме того, я намекал на него выше, но это часто лучше (и более повторное использование), чтобы yield результаты вместо того, чтобы просто их печати:

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

Теперь вы можете распечатать его в вызывающем (или делать другие вещи с ним ...):

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

Привет @mgilson. Замечательно, что именно я хотел. Большое спасибо ! – Riad

0

Вот код, который я eneded написанием с @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) 

Вы можете добавить

Смежные вопросы