python3 getDirpaths_filepathsOfDir.py

"""
模块:python3 getDirpaths_filepathsOfDir.py
功能:python3 获取某个目录下的所有文件的绝对路径。
参考:https://www.runoob.com/python3/python3-os-listdir.html
1.getFilepathsOfDir_3() -- 自己实现
    如果在调用此函数时,未对 filepaths 传参,
    则 filepaths 列表只在函数定义时创建,分配固定起始地址的存储空间。
    注:若是在同一模块中反复使用,pathFiles 必须传参,以免混淆结果。
    如果此函数,只使用一次,可传可不传。

2.现成的方法。
os.walk(top, topdown=True, onerror=None, followlinks=False)
    目录树生成器。

    对于根在顶部的目录树中的每个目录(包括顶部本身,但不包括'.' and '..'),
    产生一个包含3个元素的元组,如下:
        dirpath, dirnames, filenames

    dirpath 是一个字符串, 目录的路径。
    dirnames 是dirpath中子目录的名字的列表(不包括 '.' and '..')。
    filenames 是dirpath中非目录文件的名字的列表。
    请注意,列表中的名称只是名称,没有路径组件。
    若要获得指向dirpath中的文件或目录的完整路径(从顶部开始),
    请执行os.path.join(dirpath,name)。

    如果可选参数'topdown'为true或未指定,
    则在其任何子目录的三元组之前生成目录的三元组(目录是自上而下生成的)。
    如果topdown为false,
    则在其所有子目录的三元组之后生成目录的三元组(目录自下而上生成)。

    当topdown为true时,调用方可以修改dirnames列表
    (例如,通过del或切片分配),并且Walk只会递归到其名称保持在dirnames中的子目录中;
    这可用于修剪搜索,或强制执行特定的访问顺序。
    当topdown为false时修改dirnames是无效的,
    因为dirnames中的目录已经早于生成dirnames本身生成。
    无论topdown的值如何,在生成目录及其子目录的元组之前都会检索子目录列表。

    默认情况下,os.scandir()调用的错误将被忽略。
    如果指定了可选参数'onerror',它应该是一个函数;
    它将传一个参数调用,一个OSError实例。
    它可以报告错误以继续行走,或者抛出异常以中止行走。
    请注意,文件名可作为异常对象的文件名属性。

    默认情况下,os.walk不遵循支持它们的系统上子目录的符号链接。
    为了获得此功能,请将可选参数'followlinks' 设置为true。

    注意:如果您给top传了相对路径,请不要在恢复行走之间更改当前工作目录。
    步行从不更改当前目录,并假定客户端也不更改。

    示例:
    import os
    from os.path import join, getsize
    for root, dirs, files in os.walk('python/Lib/email'):
        print(root, "consumes", end="")
        print(sum([getsize(join(root, name)) for name in files]), end="")
        print("bytes in", len(files), "non-directory files")
        if 'CVS' in dirs:
            dirs.remove('CVS')  # don't visit CVS directories
"""
import glob
import os


# 1.使用 glob, os
def getFilepathsOfDir(dirpath):
    """
    获取指定目录下的 所有文件的路径。
    :param dirpath: 目录路径。
    :return: 文件路径的列表,如:['H:\\知识点分类总结\\dataCompress_zipfile\\DataToPack\\001\\000\\L18_0010000.b3dm', ...]。
    """
    # 1.匹配特定目录下的所有目录和文件,包含当前目录。
    matches = glob.glob(dirpath + "\\**", recursive=True)
    # print("matches:", len(matches), matches)
    # 2.获取文件路径。
    filepaths = []
    for m in matches:
        if os.path.isfile(m):
            filepaths.append(m.replace("\\", "/"))
    # print("filepaths:", len(filepaths), filepaths)
    return filepaths


def joinDirpathFilenames(dirpath, filenames):
    """
    拼接路径和文件名。
    :param dirpath: 文件的根路径,类似:F:\3dData\小学-机电合模\1\71
    :param filenames: 文件名的列表,类似:['0.b3dm', '1.b3dm', '2.b3dm']
    :return: 文件路径的列表。
    """
    filepaths = []
    for filename in filenames:
        filepaths.append(os.path.join(dirpath, filename).replace("\\", "/"))
    return filepaths


# 2.使用 os.walk
def getFilepathsOfDir_2(directory):
    """
    获取 directory 目录下的所有文件的绝对路径,
    存放到一个 列表里 返回。
    :param directory: 目标目录。
    :return: directory 目录下的所有文件的绝对路径的列表。
    """
    # filepaths,用以存放所有的文件路径!
    filepaths = []
    for root, dirs, files in os.walk(directory):
        filepaths.extend(joinDirpathFilenames(root, files))
    return filepaths


def getDirpathsOfDirectory(directory):
    """
    获取 directory 目录下的所有目录的绝对路径,
    存放到一个 列表里 返回。
    :param directory: 目标目录。
    :return: directory 目录下的所有目录的绝对路径的列表。
    """
    # dirPaths,用以存放所有的目录路径。
    # 注:dirPaths 包含 directory 目录!
    dirPaths = []
    for root, dirs, files in os.walk(directory):
        dirPaths.append(root)
    # print(dirPaths)
    # ['F:\\3dData\\小学-机电合模', 'F:\\3dData\\小学-机电合模\\1', ...]
    # print(len(dirPaths))  # 447
    return dirPaths


# 3.使用 os
def getFilepathsOfDir_3(directory, filepaths):
    """
    获取 directory 目录下,所有文件的绝对路径,并存放在 filepaths。
    directory 下可以同时有目录和文件。
    filepaths, 存放文件路径的列表。
    return filepaths
    """
    filesFolders = os.listdir(directory)
    # print(filesFolders)
    for f in filesFolders:
        pathFileOrFolder = os.path.join(directory, f)
        if os.path.isfile(pathFileOrFolder):
            # print(pathFileOrFolder)
            filepaths.append(pathFileOrFolder.replace("\\", "/"))
        else:
            getFilepathsOfDir_3(pathFileOrFolder, filepaths)
    return filepaths


if __name__ == "__main__":
    directory = r"H:\知识点分类总结\dataCompress_zipfile\DataToPack"
    # 1.使用 glob, os
    #   此方法最简洁,推荐使用。
    filepaths = getFilepathsOfDir(directory)
    print("filepaths:", len(filepaths), filepaths)
    # filepaths: 3261 ['H:/知识点分类总结/dataCompress_zipfile/DataToPack/001/000/L18_0010000.b3dm', ...]

    # 2.利用 os.walk 方法。
    filepaths = getFilepathsOfDir_2(directory)
    print("filepaths:", len(filepaths), filepaths)
    # filepaths: 3261 ['H:/知识点分类总结/dataCompress_zipfile/DataToPack/L12_0.b3dm', ...]

    # 3.自己实现的方法。
    # 以下两种形式均可。
    # filepaths = getFilepathsOfDir_3(directory, [])
    filepaths = []
    getFilepathsOfDir_3(directory, filepaths)
    print("filepaths:", len(filepaths), filepaths)
    # filepaths: 3261 ['H:/知识点分类总结/dataCompress_zipfile/DataToPack/001/000/L18_0010000.b3dm', ...]



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值