如何遍历某些扩展名的文件?

新手上路,请多包涵

我试图遍历一个文件夹和所有子文件夹以查找某些文件类型的所有文件 - 例如,仅 .mp4、.avi、.wmv。

这是我现在拥有的,它遍历所有文件类型:

 import os
rootdir = 'input'

for subdir, dirs, files in os.walk(rootdir):
     for file in files:
          print (os.path.join(subdir, file))

原文由 pufAmuf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 633
2 个回答

您可以使用 os.path.splitext 它采用路径并从其末尾拆分文件扩展名:

 import os
rootdir = 'input'
extensions = ('.mp4', '.avi', '.wmv')

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        ext = os.path.splitext(file)[-1].lower()
        if ext in extensions:
            print (os.path.join(subdir, file))

原文由 Ozgur Vatansever 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于多个扩展,最简单的就是使用 str.endswith 传递一个子字符串元组来检查:

   for file in files:
      if file.endswith((".avi",".mp4","wmv")):
         print (os.path.join(subdir, file))

您可以像下面那样使用 iglob 并链接返回的搜索或使用 re.search 但使用 endswith 可能是最好的方法。

 from itertools import chain
from glob import iglob

for subdir, dirs, files in os.walk(rootdir):
    for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) for p in ("*.avi", "*.mp4", "*wmv")) :
            print(os.path.join(subdir, file))

使用 python3.5 glob 现在支持使用 \*\* 语法进行递归搜索:

 from itertools import chain
from glob import iglob

from glob import iglob
for file in chain.from_iterable(iglob(os.path.join(rootdir,p))
      for p in (rootdir+"**/*.avi", "**/*.mp4", "**/*wmv")):
          print(file)

原文由 Padraic Cunningham 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题