2016-03-31 120 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') 

上面的工作很好。

问题1: 如何提高我的代码是这样工作的:

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

问题2: 什么是Python的方式为:

 if file==filename: 

回答

2

关于问题1:

你在问一个glob表达式。请注意,您发布的表达式不一定是唯一的,因此它可以匹配多个目录(和文件)。要获得这些文件/目录,你可以使用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)) 

关于写作没有什么“unpythonic”if x == y - 这实际上很常见。然而,就你而言,你并不需要这么做。 pythonic是使用内建运算符在列表中查找想要的对象,并根据您是否找到某个东西来构建输出。另外,我暗示了它上面,但它往往是更好(更可重复使用),以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) 

随意追加