wkdxz 发表于 2022-8-4 11:48

python 请教一个遍历目录更快的方法

本帖最后由 wkdxz 于 2022-8-4 11:54 编辑

最近在做遍历目录的程序,遇到python遍历目录的问题,尝试了两种方法:

第一种:
import os

all_dirs_list = []
all_files_list = []


def get_dir_full_path(path):# 目录下目录(完整路径)
    return [
      os.path.join(path, i) for i in os.listdir(path)
      if os.path.isdir(os.path.join(path, i))
    ]


def get_file_full_path(path):#目录下文件(完整路径)
    return [
      os.path.join(path, i) for i in os.listdir(path)
      if os.path.isfile(os.path.join(path, i))
    ]


def get_all_dirs(path):#遍历所有目录,递归
    for DIR in get_dir_full_path(path):#获取主目录下目录
      all_dirs_list.append(DIR)
      if get_dir_full_path(DIR):#如果子目录下还有子目录,递归获取
            get_all_dirs(DIR)
    return all_dirs_list


def get_all_files(path):#遍历所有文件,递归
    all_files_list.extend(get_file_full_path(path))#获取主目录下文件
    if dirs_in_path := get_dir_full_path(path):#如果有子目录,获取子目录下文件
      for DIR in dirs_in_path:
            get_all_files(DIR)
    return all_files_list


folder = r'E:\xx共享'
for i in get_all_files(folder):
    houzhui = os.path.splitext(i)[-1].lower()
    if houzhui in ['.cmd']:#筛选指定类型文件
      print(i)

第二种:
import os

def get_all_dirs(path, kw='*'):
    cmd = f'dir /s/b/ad {path}'
    if kw == '*':
      return
    else:
      return [
            i.strip() for i in os.popen(cmd) if kw in os.path.split(i)[-1]
      ]


def get_all_files(path, houzhui='*', kw='*'):
    cmd = f'dir /s/b/a-d {path}\*{kw}*.{houzhui}'
    return


path = r'E:\xx共享\其他文件\EXE'
print(get_all_dirs(path))
print(get_all_files(path, 'txt'))


因为处理的文件都在Windows系统,所以是否使用os.popen倒还无所谓。
速度方面,第二种明显快得多,之前还使用过glob库来写,但都没有 cmd 自带的 dir 使用起来得心应手。
兄弟们还有没有其他的遍历文件夹的代码,发来参考下。{:1_893:}

漁滒 发表于 2022-8-4 12:00

这个可以不?https://www.runoob.com/python/os-walk.html

sxfxtf 发表于 2022-8-4 12:43

漁滒 发表于 2022-8-4 12:00
这个可以不?https://www.runoob.com/python/os-walk.html

可以是可以,但是如果只是纯粹输出所有文件和所有文件夹, 用dir简单很多.如果里面涉及操作,判断,那用walk了

tinyDust 发表于 2022-8-4 13:19

from pathlib import Path 这个模块可以试一下。
path.iterdir()        遍历子目录用的

wkdxz 发表于 2022-8-4 14:47

tinyDust 发表于 2022-8-4 13:19
from pathlib import Path 这个模块可以试一下。
path.iterdir()        遍历子目录用的

有用的知识又增加了!{:1_893:}

from pathlib import Path as path


def all_dirs_from(dir_path):
    p = path(dir_path)
    return


def all_files_from(dir_path):
    p = path(dir_path)
    return


def special_file_from(dir_path, file_type):
    p = path(dir_path)
    return

wkdxz 发表于 2022-8-4 14:49

漁滒 发表于 2022-8-4 12:00
这个可以不?https://www.runoob.com/python/os-walk.html

这个可以有

emptynullnill 发表于 2022-8-4 16:47

pathlib 大法好,既不用+号拼接路径,也不用怕中文路径
页: [1]
查看完整版本: python 请教一个遍历目录更快的方法