"""
模块: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', ...]
python3 getDirpaths_filepathsOfDir.py
最新推荐文章于 2024-06-09 09:55:59 发布