Python 文件与目录操作实战指南
本文系统讲解 Python 中文件与目录的底层操作方法,涵盖 os 与 shutil 核心模块的路径解析、权限检测、多模式读写及文件夹迁移。结合批量重命名图片的真实场景,提供可执行代码与安全操作规范,帮助开发者高效处理本地文件系统任务。
一、准备环境:导入基础模块
Python 标准库内置了强大的文件系统处理能力。编写相关脚本前,需引入以下两个核心模块:
import os
import shutil
二、路径检测与信息提取(os 模块)
在实际开发中,首先需确认目标位置是否存在且类型符合预期。以下函数常用于运行前的校验与环境适配:
- 当前工作目录:
os.getcwd()返回脚本运行的绝对路径。 - 路径组件拆分:
os.path.split('D:/data/report.txt')结果为('D:/data', 'report.txt')。 - 扩展名分离:
os.path.splitext('image.png')返回('image', '.png')。 - 存在性与类型判断:
os.path.exists(path)检查完整路径;os.path.isfile(path)与os.path.isdir(path)分别验证是否为文件或目录。
其他平台相关参数如 os.linesep(行终止符,Windows为'
',Linux为'
')、os.name(平台标识,'nt'表示Windows,'posix'表示类Unix)可用于跨平台逻辑兼容。获取文件元数据可通过 os.stat(file),文件大小查询使用 os.path.getsize(filename)。
三、文件读取、写入与光标定位
打开文件是数据处理的第一步。使用 open() 时需严格指定模式,否则可能导致数据丢失或乱码:
# 文本模式:w(覆盖写)、a(追加写)、r+(读写,不创建新文件)
# 二进制模式:rb(读)、wb(写)、ab(追加),适用于图片、音视频等
获取文件对象 fp 后,常用操作如下:
fp.read(size):一次性读取指定字节数(文本模式下按字符计)。fp.readline():读取单行内容。配合for line in fp:可实现逐行遍历(Python 3 推荐写法,替代旧版fp.next())。fp.readlines():将全部行装入列表返回。fp.write(str)/fp.writelines(seq):写入字符串或可迭代序列。注意不会自动添加换行符。fp.seek(offset, whence):移动读写指针。whence=0从头算,1从当前位置,2从末尾。以a/a+模式打开的文件每次写入后指针会自动跳至末尾。fp.truncate([size]):截断文件。默认截断至当前指针位置,超出原长度则补零。
所有操作完成后务必调用 fp.close() 或推荐使用 with open(...) as fp: 上下文管理器,防止资源泄露。对已关闭文件继续读写会触发 ValueError。
四、目录管理与安全清理(shutil 模块)
【风险提示】目录删除与覆盖操作不可逆,涉及生产数据前请务必完成备份,或在测试环境中先行验证。
- 创建与切换:
os.mkdir("dir")创建单层目录;os.makedirs("a/b/c")级联创建。os.chdir("path")更改当前工作路径。 - 文件/文件夹复制:
shutil.copyfile("src", "dst")仅支持文件拷贝;shutil.copy("src", "dst_dir")可拷贝文件至目标目录或重命名;shutil.copytree("src_dir", "dst_dir")递归复制整个文件夹,要求dst_dir不存在。 - 移动与重命名:
os.rename("old", "new")和shutil.move("old", "new")均可用于文件重命名或跨盘迁移。 - 彻底删除:
os.rmdir("dir")仅限空目录;非空目录清理需使用shutil.rmtree("dir")。
五、真实操作顺序:批量重命名图片
以下脚本演示如何遍历指定目录,筛选常见图像格式并为文件名追加后缀 _fc。代码已优化路径拼接方式并全面适配 Python 3:
import os
import time
def rename_images(target_dir):
# 验证路径有效性
if not os.path.isdir(target_dir) and not os.path.isfile(target_dir):
return False
img_exts = {'bmp', 'jpeg', 'gif', 'psd', 'png', 'jpg'}
processed_count = 0
def process_item(current_path):
nonlocal processed_count
if os.path.isfile(current_path):
parent_dir, filename = os.path.split(current_path)
_, ext = os.path.splitext(filename)
if ext.lower().lstrip('.') in img_exts:
new_filename = f"{os.path.splitext(filename)[0]}_fc{ext}"
# 使用 os.path.join 避免手动拼接导致的跨平台错误
new_path = os.path.join(parent_dir, new_filename)
os.rename(current_path, new_path)
processed_count += 1
elif os.path.isdir(current_path):
for item in os.listdir(current_path):
process_item(os.path.join(current_path, item))
process_item(target_dir)
return processed_count
# 配置目标路径并统一正斜杠
dir_path = r'D:\xx\xx\images'.replace('\\', '/')
start_time = time.time()
total = rename_images(dir_path)
elapsed = time.time() - start_time
print(f'程序运行耗时:{elapsed:.2f}秒')
print(f'总共处理了 {total} 张图片')
简要总结
掌握 os 与 shutil 的核心接口即可应对绝大多数本地文件管理需求。实际应用中应优先采用 with 语句管理文件句柄,利用相对路径与 os.path.join 提升跨平台兼容性,并在执行破坏性命令前养成路径二次校验的习惯。以上就是 Python 文件读写与目录管理的详细内容,更多关于 Python 基础操作与自动化脚本的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









