os.walk 带通配符的路径

os.walk a path with wildcard

我想遍历一个目录并搜索给定的文件。这是我写的一些代码:

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: 什么是 Pythonic 方式:

      if file==filename:

关于问题 1:

你问的是 glob 表达式。请注意,您发布的表达式不一定是唯一的,因此它可以匹配多个目录(和文件)。要获得那些 files/directories,您可以使用 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没什么"unpythonic" -- 其实很常见。但是,就您而言,您实际上并不需要这样做。 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)

这是我根据@mgilson 的建议最终编写的代码

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)

欢迎追加