10 KiB
技术文档:文件与路径操作工具库
本项目是一个轻量级的 Python 工具模块,封装了常用的文件系统操作功能,包括临时文件生成、路径处理、目录遍历、文件复制/删除等。适用于跨平台(Windows/Linux/macOS)环境下的文件管理任务。
目录
1. 模块概览
该模块提供以下主要功能:
| 功能类别 | 提供的功能 |
|---|---|
| 路径与目录操作 | ProgramPath, listFolder, listFile, folderInfo, _mkdir, rmdir_recursive |
| 文件操作 | temp_file, _copyfile, _copydir |
| 字符串辅助 | startsWith, endsWith |
| 时间格式化 | timestamp2datatiemStr |
| 随机路径生成 | filepoolpath |
⚠️ 注:部分 Windows 特定代码(如
win32api)已被注释,当前版本为通用跨平台实现。
2. 依赖说明
内置依赖
此模块仅使用 Python 标准库,无需额外安装第三方包:
import os
import sys
import stat
import platform
import time
import random
import tempfile
可选依赖(已注释)
# import win32api # 用于获取逻辑驱动器信息(Windows专用),目前未启用
若需启用驱动器扫描功能,请通过
pip install pywin32安装对应模块并取消注释。
3. 函数列表
| 函数名 | 描述 |
|---|---|
temp_file(suffix=None, prefix=None, dir=None, text=False) |
创建一个唯一的临时文件并返回其路径 |
filepoolpath(root) |
基于哈希算法生成分层存储路径,用于避免大量文件集中在同一目录 |
startsWith(text, s) |
判断字符串是否以指定前缀开头 |
endsWith(text, s) |
判断字符串是否以指定后缀结尾 |
ProgramPath() |
获取当前脚本或可执行文件所在目录 |
timestamp2datatiemStr(ts) |
将时间戳转换为标准日期时间字符串格式 |
listFolder(path, recursive=False) |
遍历目录下所有子文件夹(支持递归) |
listFile(folder, suffixs=[], recursive=False) |
遍历目录中符合条件的文件(支持扩展名过滤和递归) |
folderInfo(root, uri='') |
返回指定目录下的文件/文件夹元数据列表 |
rmdir_recursive(dir) |
递归删除目录及其内容 |
_mkdir(newdir) |
安全创建目录(自动创建父级目录,若已存在不报错) |
_copyfile(fp, dir) |
复制文件到目标目录,并解决重名问题 |
_copydir(fp, dir, topdistinct) |
递归复制整个目录结构 |
mkdir, copyfile, copydir, rmdir |
上述函数的别名,便于调用 |
4. 核心函数详解
temp_file(...)
用途:安全地创建一个临时文件并关闭句柄,返回文件路径。
参数:
suffix(str): 文件后缀(如.tmp)prefix(str): 文件名前缀dir(str): 存放目录;默认为系统临时目录text(bool): 是否以文本模式打开(实际未使用)
返回值:
str - 生成的临时文件完整路径。
示例:
fp = temp_file(suffix='.log', prefix='app_', dir='/tmp')
# => /tmp/app_abc123.log
filepoolpath(root)
用途:根据随机数对多个质数取模,构建多层级子目录路径,适合大规模文件分布存储。
原理:利用五个质数 [191, 193, 197, 199, 97] 对随机值取模,形成五层嵌套目录结构,有效分散 I/O 压力。
参数:
root(str): 根目录路径
返回值:
str - 如 /data/100/87/45/23/67
应用场景:
日志系统、上传服务、缓存池等需要防止单目录文件过多的情况。
startsWith(text, s) / endsWith(text, s)
用途:替代原生 str.startswith() 和 str.endswith() 的简化版本(兼容性写法)。
参数:
text(str): 待检测字符串s(str): 匹配子串
返回值:
bool - 是否匹配成功
ProgramPath()
用途:获取程序运行时所在的根目录,支持 PyInstaller 打包后的可执行文件。
行为逻辑:
- 如果是打包后的
.exe或二进制文件(sys.frozen == True),则返回sys.executable所在目录。 - 否则返回
sys.argv[0](即主脚本)所在目录。
返回值:
str - 绝对路径,表示程序运行目录。
timestamp2datatiemStr(ts)
用途:将 Unix 时间戳转换为可读的时间字符串。
❗ 函数名拼写错误:应为
timestamp2datetimeStr,但保留原始命名。
参数:
ts(int/float): 时间戳
返回值:
str - 格式为 "YYYY-MM-DD HH:MM:SS" 的时间字符串
示例输出:
2025-04-05 14:23:01
listFolder(path, recursive=False)
用途:列出指定路径下的所有子目录(可递归)。
参数:
path(str): 起始路径recursive(bool): 是否递归进入子目录
返回值:
生成器对象,逐个返回每个子目录的绝对路径。
示例:
for d in listFolder('/home/user', recursive=True):
print(d)
listFile(folder, suffixs=[], recursive=False)
用途:查找目录中符合扩展名条件的文件。
参数:
folder(str): 搜索起始路径suffixs(list): 扩展名列表(如['.txt', '.py']),忽略大小写recursive(bool): 是否递归搜索
返回值:
生成器对象,返回匹配文件的绝对路径。
注意:
- 若
suffixs为空,则返回所有文件。 - 扩展名建议包含点号(
.)。
示例:
pdfs = list(listFile('/docs', ['.pdf'], recursive=True))
folderInfo(root, uri='')
用途:获取某虚拟路径下的文件/文件夹详细信息列表。
参数:
root(str): 实际根目录uri(str): 虚拟路径(如/user/docs)
逻辑说明:
- 支持类似 Web 的 URI 路径解析(如
/a/b/c→root/a/b/c) - 自动分割
/并拼接真实路径 - 返回包含类型、大小、修改时间等信息的字典列表
返回项结构:
{
"id": "/user/docs/report.pdf",
"name": "report.pdf",
"path": "user/docs",
"type": "file",
"size": 10240,
"mtime": "2025-04-05 14:23:01"
}
适用场景:
文件浏览器后端接口、资源管理器 API 数据源。
rmdir_recursive(dir)
用途:递归删除非空目录。
特性:
- 对只读文件先修改权限(加写权限)再删除
- 先删除子项,最后删除自身目录
- 不会抛出“目录非空”异常
警告:危险操作,请确保路径正确!
_mkdir(newdir)
用途:智能创建目录,支持自动创建父级目录。
特性:
- 若目录已存在,静默跳过(无异常)
- 若中间路径不存在,则自动补全
- 等价于
os.makedirs(..., exist_ok=True)
_copyfile(fp, dir)
用途:将文件复制到目标目录,并自动处理同名冲突。
流程:
- 读取源文件名
- 调用
getFileName(name, dir)解决重名(见备注) - 分块读取(64KB)进行复制,节省内存
- 返回布尔值表示是否成功
✅ 支持大文件复制
_copydir(fp, dir, topdistinct)
用途:递归复制整个目录树。
参数:
fp: 源目录路径dir: 目标父目录topdistinct: 防止顶层重复复制的标记路径
机制:
- 在目标目录下创建同名新目录
- 遍历子项:如果是目录则递归复制,否则调用
_copyfile - 忽略
topdistinct层以防循环引用
别名定义:
mkdir = _mkdir
copyfile = _copyfile
copydir = _copydir
rmdir = rmdir_recursive
5. 使用示例
示例 1:创建临时日志文件
log_path = temp_file(suffix='.log', prefix='myapp_')
with open(log_path, 'w') as f:
f.write("App started at %s\n" % time.time())
示例 2:组织海量图片存储路径
storage_root = "/images"
img_path = filepoolpath(storage_root)
os.makedirs(img_path, exist_ok=True)
shutil.move(upload_file, os.path.join(img_path, 'photo.jpg'))
示例 3:列出所有 Python 文件
for py_file in listFile('/project', suffixs=['.py'], recursive=True):
print("Found:", py_file)
示例 4:获取目录信息用于前端展示
info = folderInfo('/data', '/user/docs')
import json
print(json.dumps(info, indent=2))
示例 5:安全删除缓存目录
cache_dir = os.path.join(ProgramPath(), 'cache')
if os.path.exists(cache_dir):
rmdir(cache_dir)
6. 注意事项
⚠️ 已知问题
-
函数名拼写错误:
def timestamp2datatiemStr(ts): ...正确应为
timestamp2datetimeStr,请在后续版本中修正。 -
getFileName函数缺失: 在_copyfile和_copydir中调用了getFileName(name, dir),但在代码中未定义。推测是外部依赖或遗漏函数。🛠️ 建议补充如下实现:
def getFileName(name, directory): base_name, ext = os.path.splitext(name) counter = 1 new_name = name while os.path.exists(os.path.join(directory, new_name)): new_name = f"{base_name}_{counter}{ext}" counter += 1 return new_name -
Windows 权限处理局限性:
rmdir_recursive中仅设置0o600权限,可能不足以应对某些系统限制(如只读属性)。建议增加os.chmod(..., stat.S_IWRITE)更健壮。 -
findAllDrives被注释: 当前无法枚举磁盘驱动器。如需恢复,请引入pywin32并取消注释相关代码。
许可证
默认遵循 Python 软件基金会许可证(PSF License),允许自由使用、修改和分发。
更新建议(TODO)
| 编号 | 建议内容 |
|---|---|
| 1 | 修复 timestamp2datatiemStr 拼写错误 |
| 2 | 补全 getFileName() 函数实现 |
| 3 | 添加单元测试样例 |
| 4 | 增加日志记录功能(可选) |
| 5 | 文档化异常处理机制 |
| 6 | 提供 movefile, movedir 扩展功能 |
✅ 本模块适合作为基础组件集成至各类文件管理系统、备份工具、资源上传服务中。