如何使用os.walk或任何其他替代方法通过自然名称顺序递归遍历文件夹?

雌激素

在python中,如果我递归地通过os.walk遍历所有文件夹以查找具有定义的扩展名的filr。这是我目前的代码;

def get_data_paths(root_path, ext = '*.jpg'):
    import os
    import fnmatch
    matches = []
    classes = []
    class_names = []
    for root, dirnames, filenames in os.walk(root_path):
      for filename in fnmatch.filter(filenames, ext):
          matches.append(os.path.join(root, filename))
          class_name =  os.path.basename(os.path.dirname(os.path.join(root, filename)))
          if class_name not in class_names:
               class_names.append(class_name)
          classes.append(class_names.index(class_name))

    print "There are ",len(matches), " files're found!!"
    return matches, classes, class_names

但是这里的问题是,此函数以文件夹名称的奇怪python顺序访问文件夹。相反,我想遍历AZ。我应该如何修改此代码或使用其他替代方法来执行此操作?

迈克·德西蒙

默认情况下,topdown参数toos.walkTrue,因此,在降级其目录之前,将报告目录三元组。文档状态

调用者可以dirnames就地修改列表(可能使用del或切片分配),并且walk()仅递归到名称保留在的子目录中dirnames这可用于修剪搜索,强加特定的访问顺序,甚至可walk()在调用者walk()再次恢复之前告知其创建或重命名的目录

粗体的地雷。因此,您需要做的就是:

for root, dirnames, filenames in os.walk(root_path):
    dirnames[:] = natsort.natsorted(dirnames)
    # continue with other directory processing...

由于需要在适当位置编辑列表,因此需要使用[:]切片符号。


这是os.walk的操作示例给定一个目录树,如下所示:

$ ls -RF cm3mm/SAM3/src
Applets/                RTC.cc          SAM3X/
DBGUWriteString.cc  SAM3A/          SMC.cc.in
EEFC.cc             SAM3N/          SoftBoot.cc
Memories.txt        SAM3S/
PIO.cc              SAM3U/

cm3mm/SAM3/src/Applets:
AppletAPI.cc   IntFlash.cc   Main.cc        MessageSink.cc  Runtime.cc

cm3mm/SAM3/src/SAM3A:
Map.txt     Pins.txt

cm3mm/SAM3/src/SAM3N:
Map.txt     Pins.txt

cm3mm/SAM3/src/SAM3S:
Map.txt     Pins.txt

cm3mm/SAM3/src/SAM3U:
Map.txt     Pins.txt

cm3mm/SAM3/src/SAM3X:
Map.txt     Pins.txt

现在,让我们看看os.walk它的作用:

>>> import os
>>> for root, dirnames, filenames in os.walk("cm3mm/SAM3/src"):
...     print "-----"
...     print "root =", root
...     print "dirnames =", dirnames
...     print "filenames =", filenames
...
-----
root = cm3mm/SAM3/src
dirnames = ['Applets', 'SAM3A', 'SAM3N', 'SAM3S', 'SAM3U', 'SAM3X']
filenames = ['DBGUWriteString.cc', 'EEFC.cc', 'Memories.txt', 'PIO.cc', 'RTC.cc', 'SMC.cc.in', 'SoftBoot.cc']
-----
root = cm3mm/SAM3/src/Applets
dirnames = []
filenames = ['AppletAPI.cc', 'IntFlash.cc', 'Main.cc', 'MessageSink.cc', 'Runtime.cc']
-----
root = cm3mm/SAM3/src/SAM3A
dirnames = []
filenames = ['Map.txt', 'Pins.txt']
-----
root = cm3mm/SAM3/src/SAM3N
dirnames = []
filenames = ['Map.txt', 'Pins.txt']
-----
root = cm3mm/SAM3/src/SAM3S
dirnames = []
filenames = ['Map.txt', 'Pins.txt']
-----
root = cm3mm/SAM3/src/SAM3U
dirnames = []
filenames = ['Map.txt', 'Pins.txt']
-----
root = cm3mm/SAM3/src/SAM3X
dirnames = []
filenames = ['Map.txt', 'Pins.txt']

每次循环时,您都会获得一个目录的目录和文件我们确切知道哪个文件属于哪个文件夹:中的文件filenames属于该文件夹root

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将使用飞碟生成的 PDF 直接保存到 /resources 或任何其他文件夹

如何检测URL位置是否在此页面以及同一域的任何其他子文件夹中

如何使用os.walk获得的Python中的natsort对文件夹名称进行排序?

如何遍历目录并仅使用C#通过Web方法返回文件夹名称?

如何使用递归或任何其他方法实现LCM(1到N),N> 2?

遍历文件夹并使用文件夹名称顺序重命名每个文件夹中的所有文件

如何使用 os.walk() 计算文件夹的直接子文件夹的大小

jar文件需要在它旁边的db文件夹,以便应用程序运行,如何使用“ javapackager”或任何其他工具捆绑该文件夹

如何使用 python 的任何 Windows 文件夹的 os.listdir() 方法摆脱 desktop.ini

如何选择/复制文件夹1中名称与其他文件夹2中的其他文件夹匹配的所有文件夹

如何使用freelan(或任何其他免费替代方案)在HTTP上设置VPN?

如何通过框架API或任何其他有效方法查找VPN连接的状态?

每当将新图像添加到服务器存储的图像文件夹时,如何使用PHP或任何其他服务器端脚本创建自动html标签。

如何遍历目录并将特定文件移动到其他文件夹

如何从递归目录中提取专门命名的文件夹,然后删除其他文件夹?

使用os.walk()时如何排除目录?其他方法无效

执行 os.walk 时如何忽略文件夹

如何遍历文件夹A的子文件夹以获取每个子文件夹中的文件名并使用VBA从文件夹B复制其他同名文件

使用 os.walk 时跳过某个文件夹

如何删除与“用户|文件夹|其他”中的任何模式匹配的文件或目录?

如何强制IntelliJ使用其他主文件夹

如何引用其他文件夹?

如何通过在python中打开该文件夹中的其他文件来打开文件夹循环

如果文件夹名称包含空格,如何通过使用批处理文件执行任何.exe

如何使用其他文件夹中文件的相同名称重命名多个图像?

OS X查找和RM通过名称中带有空格的文件夹递归通过吗?

如何使用 execvp 或任何其他 exec 僅在一個文件上運行?

使用Jasmine或任何其他替代方案在Node上运行测试.mjs / ESM

提取目录中的文件夹名称列表后,如何使用Python以其他格式重命名它们?