os.walk一条带有通配符的路径

时间:2016-03-31 04:41:36

标签: python find 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: 什么是Pythonic方式:

      if file==filename:

2 个答案:

答案 0 :(得分:3)

关于问题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)

答案 1 :(得分:0)

以下是我与@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)

随意附加