首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >os.walk列表目录

os.walk列表目录
EN

Code Review用户
提问于 2018-03-12 10:22:01
回答 2查看 3.1K关注 0票数 4

我使用此脚本获取文件夹及其子文件夹中所有照片的列表。然而,这个计划似乎真的很慢。

此文件夹和子文件夹中有50,000张.jpg图片。我可以减少for循环,但程序仍然或多或少地以相同的速度运行。

我也愿意使用lambda,但希望以最好的速度使用Python的基本功能。有人能建议改进吗?

代码语言:javascript
复制
import os
from fnmatch import fnmatch
import sys

root = "C:\\Users\\Agartha\\Desktop\\photos"
pattern = "*.jpg"

with open("./files\\list.txt", "w") as a:
    for path, subdirs, files in os.walk(root):
       for filename in files:
            if fnmatch(filename,pattern):
                a.write(str(os.path.join(filename)) + '\n')
EN

回答 2

Code Review用户

发布于 2018-03-12 12:56:13

在这里,你同时做四件事。你是

  1. 遍历目录中的所有文件
  2. 将文件名与模式进行比较
  3. 格式化文件名
  4. 将文件名追加到文件中

要找出较慢的步骤是什么,您应该将其解耦。

代码语言:javascript
复制
def find_files(root):
    for path, subdirs, files in os.walk(root):
        for filename in files:
            yield filename

def filter_filename(files, pattern):
    for filename in files:
        if fnmatch(filename,pattern):
            yield filename

def format_filenames(files, root):
    for filename in files:
        yield str(os.path.join(filename)) + '\n'

def writelines(out_file, files):
    for filename in files:
        out_file.write(filename)
    # or:
    # out_file.writelines(files)

def main(root, pattern, filename_out):
    files = find_files(root)
    files_filtered = filter_filename(files, pattern)
    files_formatted = format_filenames(files, root)
    with open(filename_out, 'w') as out_file:
        writelines(out_file, files_formatted)

然后,你可以单独花4件时间去找出时间消耗中最大的罪魁祸首,然后再去做:

  1. files = list(find_files(root))
  2. files_filtered = list(filter_filename(files, pattern))
  3. files_formatted = list(format_filenames(files, root))
  4. with open(filename_out, 'w') as out_file: writelines(out_file, files_formatted)
票数 2
EN

Code Review用户

发布于 2018-03-12 13:20:08

主要的问题是,您的方法严重依赖您的硬盘驱动器。进程需要递归地查看每个子文件夹,这需要时间,尤其是50000个文件。

窗口搜索的速度要快得多,因为它对文件进行索引,并且不扫描每个查询的整个驱动器。

如果使用Python3是可能的,那么在您的代码中唯一要更改的就是使用glob并将循环替换为:

代码语言:javascript
复制
import glob
glob.glob("C:\\Users\\Agartha\\Desktop\\photos\\**\\*.jpg", recursive=True)
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/189390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档