我正在使用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)