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)
欢迎追加
我想遍历一个目录并搜索给定的文件。这是我写的一些代码:
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)
欢迎追加