使用python-os.walk如何检查目录名并只处理特定目录中的文件(递归)



我正在使用os.walk运行目录"foo";。我想处理.dat文件,但如何检查目录名并只处理特定目录?

如果dir="0";条";然后处理files.dat;notbar";。我可能错过了一些简单的

C:datafoo
- notbar
-123
-file1.dat
-456
-file2.dat
-file3.dat
- bar
-123
-file1.dat
-456
-file2.dat
-file3.dat

这将查找所有.dat文件。。。。

for (root, dirnames, filenames) in os.walk(base_path):
print('Found directory: {0}'.format(root))
for filename in filenames:
if filename.endswith(".dat"):
print(filename)

glob确实很好。它返回与特定模式匹配的所有文件。

有一个模式参考,但最有用的是:

  • *匹配除路径斜杠之外的所有内容(适用于windows,/适用于mac/linux(
  • **匹配零个或多个目录

在您的示例中,您希望在基本路径base_path内的子目录(bar(的任何子目录(*(中查找.dat(*.dat(文件。为了得到这些文件,我们可以写

from glob import glob
filenames = glob(base_path + "\bar\*\*.dat")

跨平台最好使用os.path.join

from glob import glob
filenames = glob(os.path.join(base_path, "bar", "*", "*.dat"))

点击此处查看结果

如果bar不一定是base_path的直接子目录,而是嵌套在下面,则可以使用**:

from glob import glob
filenames = glob(os.path.join(base_path, "**", "bar", "*", "*.dat"))

最后,glob不一定会以任何顺序返回文件。要按字母顺序排列,请使用sorted(filenames)。按照这个答案使用sorted(filenames, key=os.path.getmtime),以修改它们的顺序。

如注释中所述,一个可能的解决方案可以是执行第二个os.walk。详细介绍

databasePath = ".database"
import os
for (root, dirs, files) in os.walk(databasePath):
for dir in dirs:
if dir == "myLabel":
for (_root, _dirs, _files) in os.walk(os.path.join(root, dir)):
i = 0
print(_files)

最新更新