我想遍历目录并搜索给定文件。这是我写的一些代码:
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:
答案 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)
随意附加