一、os 模块是什么
os 模块是python标准库的一部分,无需额外安装即可使用。它封装了不同操作系统(windows、linux、macos等)的底层系统调用,提供了一致的接口使用,它可以让我们在python中执行各种操作系统级别的任务,如创建/删除目录、遍历文件系统、管理文件路径等。
二、路径操作
1. 获取当前工作目录
需求场景:
- 需要知道脚本当前运行的位置
- 需要基于当前目录构建相对路径
- 调试时确认程序的工作目录是否正确
os.getcwd() 返回的是字符串形式的绝对路径。
import os
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
2. 改变工作目录
需求场景:
- 需要切换到特定目录进行操作
- 处理相对路径前确保在正确的目录下
- 临时切换到某个目录处理文件后又需要返回原目录
os.chdir() 会改变当前进程的工作目录。如果目标目录不存在会抛出 filenotfounderror
os.chdir('/path/to/new/directory')
print(f"新工作目录: {os.getcwd()}")
3. 路径拼接
需求场景:
- 构建跨平台的路径时(windows用\,linux和mac用/)
- 动态组合路径各部分
- 避免手动拼接路径导致的错误
使用 os.path.join() 可以安全地拼接路径,它会自动处理不同操作系统的路径分隔符。
path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"拼接后的路径: {path}")
# 在windows上输出: folder\subfolder\file.txt
# 在linux/mac上输出: folder/subfolder/file.txt
4. 路径分解与提取
需求场景:
- 需要单独获取文件名或目录名
- 批量处理文件扩展名
- 分析用户提供的文件路径
os.path.dirname() 和 os.path.basename() 是互补的操作。os.path.splitext()只会分离最后一个扩展名,对于多重扩展名(如".tar.gz")需要特别注意。
file_path = "/home/user/documents/report.txt"
# 获取路径的目录部分
dir_name = os.path.dirname(file_path)
print(f"目录部分: {dir_name}") # /home/user/documents
# 获取文件名部分
base_name = os.path.basename(file_path)
print(f"文件名部分: {base_name}") # report.txt
# 分割文件扩展名
name, ext = os.path.splitext(base_name)
print(f"文件名: {name}, 扩展名: {ext}") # 文件名: report, 扩展名: .txt
5. 路径有效性检查
需求场景:
- 处理输入路径前验证有效性
- 确保文件/目录存在再进行操作
- 编写安装脚本时需要检查目标位置
这些检查函数不会抛出异常,而是返回布尔值。对于符号链接,os.path.isfile() 和 os.path.isdir()会跟随链接检查目标文件/目录。
path = "/some/path/to/file.txt"
print(f"路径是否存在: {os.path.exists(path)}")
print(f"是否是文件: {os.path.isfile(path)}")
print(f"是否是目录: {os.path.isdir(path)}")
print(f"是否是绝对路径: {os.path.isabs(path)}")
三、目录操作
1. 创建目录
需求场景:
- 程序需要生成输出目录
- 安装程序创建必要的目录结构
- 上传文件前确保目标目录存在
os.mkdir() 只能创建单级目录,如果父目录不存在会抛出 filenotfounderror。而 os.makedirs()可以递归创建多级目录,exist_ok=true 参数使得目录已存在时不会报错。
# 创建单个目录
os.mkdir('new_directory')
# 创建多级目录
os.makedirs('parent/child/grandchild', exist_ok=true) # exist_ok=true 避免目录已存在时报错
2. 删除目录
需求场景:
- 清理临时目录
- 卸载程序删除相关目录
- 定期清理旧数据
os.rmdir()只能删除空目录,否则会抛出 oserror。要删除非空目录需要使用 shutil.rmtree(),它会递归删除整个目录树,使用时需特别小心。
# 删除空目录
os.rmdir('empty_directory')
# 删除目录树 (谨慎使用!)
import shutil
shutil.rmtree('directory_with_contents')
3. 遍历目录
需求场景:
- 批量处理目录中的文件
- 实现文件搜索功能
- 统计目录内容
- 备份目录结构
os.listdir() 只返回指定目录的直接内容,不包含子目录内容。os.walk() 是生成器函数,会递归遍历所有子目录,返回三元组(当前目录路径,子目录列表,文件列表)。可以通过修改 dirs 列表来控制遍历过程。
# 列出目录内容
print("当前目录内容:")
for item in os.listdir('.'):
print(item)
# 使用os.walk递归遍历目录
print("\n递归遍历目录结构:")
for root, dirs, files in os.walk('.'):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print("-" * 40)
四、文件操作
1. 文件重命名
需求场景:
- 批量重命名文件
- 添加时间戳到文件名
os.rename() 也可以用于移动文件(如果在不同目录下)。如果目标文件已存在,在windows上会抛出 fileexistserror,在unix系统上会静默覆盖。
os.rename('old_name.txt', 'new_name.txt')
# 为日志文件添加日期前缀
log_file = "app.log"
today = datetime.now().strftime("%y%m%d")
new_name = f"{today}_{log_file}"
os.rename(log_file, new_name)
2. 删除文件
需求场景:
- 清理临时文件
- 实现文件删除功能
- 定期清理旧文件
os.remove() 只能删除文件,不能删除目录。删除前最好检查文件是否存在和是否有权限删除。
os.remove('file_to_delete.txt')
# 删除一周前的临时文件(基于文件修改时间进行选择性删除)
for file in os.listdir('temp'):
file_path = os.path.join('temp', file)
if os.path.isfile(file_path):
file_age = time.time() - os.path.getmtime(file_path)
if file_age > 7 * 24 * 3600: # 7天
os.remove(file_path)
3. 获取文件信息
需求场景:
- 显示文件详细信息
- 按大小/时间筛选文件
os.stat() 返回的 st_mtime 和 st_ctime 是时间戳(秒数),可以使用 datetime.fromtimestamp() 转换为可读格式。
file_stat = os.stat('some_file.txt')
print(f"文件大小: {file_stat.st_size} 字节")
print(f"最后修改时间: {file_stat.st_mtime}")
print(f"创建时间: {file_stat.st_ctime}")
五、环境变量操作
需求场景:
- 读取系统配置
- 根据环境改变程序行为(开发/生产环境)
- 安全存储敏感信息(如api密钥)
通过 os.environ 设置的环境变量只在当前进程及其子进程中有效,不会影响系统环境变量。os.getenv() 比直接访问 os.environ 更安全,因为当变量不存在时可以指定默认值。
# 获取环境变量
home_dir = os.getenv('home') # 或 os.environ.get('home')
print(f"用户主目录: {home_dir}")
# 设置环境变量(仅当前进程有效)
os.environ['my_var'] = 'some_value'
print(f"my_var: {os.getenv('my_var')}")
六、跨平台路径处理
需求场景:
- 编写需要在多个操作系统运行的脚本
- 处理用户提供的不同格式的路径
- 确保路径比较的正确性
os.path 模块提供了跨平台的路径处理方法,os.path.normpath() 会解析路径中的 . 和 …,并标准化路径分隔符。os.path.abspath() 会将路径转换为绝对路径,基于当前工作目录。os.path.commonpath()比 os.path.commonprefix() 更准确,因为它会考虑路径分隔符。
path = "/home/user/docs/file.txt"
print(f"路径分隔符: {os.path.sep}") # linux: /, windows: \
print(f"路径标准化: {os.path.normpath('docs/../docs/file.txt')}")
print(f"绝对路径: {os.path.abspath('file.txt')}")
print(f"共同前缀: {os.path.commonprefix(['/usr/lib', '/usr/local/lib'])}") # /usr/l
print(f"共同路径: {os.path.commonpath(['/usr/lib', '/usr/local/lib'])}") # /usr
七、实用示例
示例1:批量重命名文件
需求场景:
- 整理照片库(添加日期/地点前缀)
- 标准化下载的文件名
- 批量修改项目中的资源文件名
示例展示了如何批量修改文件名。在实际应用中,可以扩展为更复杂的重命名规则,如添加序号、修改扩展名、根据文件内容重命名等。
def batch_rename(directory, prefix):
"""为目录中的所有文件添加前缀"""
for filename in os.listdir(directory):
if os.path.isfile(os.path.join(directory, filename)):
new_name = prefix + filename
os.rename(
os.path.join(directory, filename),
os.path.join(directory, new_name)
)
print(f"重命名: {filename} -> {new_name}")
# 使用示例
batch_rename('./photos', 'vacation_')
示例2:查找特定扩展名的文件
需求场景:
- 收集所有日志文件(.log)进行分析
- 查找项目中的所有图片资源(.jpg,.png)
- 统计源代码文件数量(.py等)
使用 os.walk() 递归搜索目录。file.endswith() 是大小写敏感的,如果需要不区分大小写,可以改为 file.lower().endswith(extension.lower())
def find_files_by_extension(directory, extension):
"""递归查找目录中特定扩展名的文件"""
matches = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(extension):
matches.append(os.path.join(root, file))
return matches
# 使用示例
py_files = find_files_by_extension('.', '.py')
print("找到的python文件:")
for file in py_files:
print(file)
示例3:计算目录大小
需求场景:
- 实现磁盘空间检查功能
- 限制用户上传目录的大小
- 分析项目各模块占用空间
这个函数计算的是目录中所有文件的实际大小总和,不包括目录元数据占用的空间。跳过了符号链接以避免重复计算或无限递归。对于非常大的目录,可能需要优化性能。
def get_directory_size(directory):
"""计算目录总大小(字节)"""
total = 0
for dirpath, dirnames, filenames in os.walk(directory):
for f in filenames:
fp = os.path.join(dirpath, f)
# 跳过符号链接
if not os.path.islink(fp):
total += os.path.getsize(fp)
return total
# 使用示例
size = get_directory_size('./')
print(f"目录总大小: {size} 字节 ({size/1024/1024:.2f} mb)")
八、安全注意事项
- 使用
os.path而不是手动拼接路径,确保跨平台兼容性 - 执行删除操作前先检查路径是否存在
- 处理用户提供的路径时要小心,防止目录遍历攻击
- 考虑使用
try-except处理可能的异常
文件操作可能引发多种异常,如权限不足、文件不存在、路径无效等。对于关键操作,建议先检查再执行,并做好异常处理。
try:
os.remove('important_file.txt')
except filenotfounderror:
print("文件不存在,无需删除")
except permissionerror:
print("没有删除文件的权限")
九、总结
掌握python 的 os 模块,为操作文件和目录提供更多便利:
- 安全地处理各种路径操作
- 创建、删除和遍历目录结构
- 管理文件和获取文件信息
- 访问和修改环境变量
- 编写跨平台的脚本
在实际开发中,可以根据具体需求选择合适的函数,并注意异常处理和跨平台兼容性。
以上就是python使用os模块操作文件与目录的完整指南的详细内容,更多关于python os模块操作文件与目录的资料请关注代码网其它相关文章!
发表评论