文章目录
- 需求场景: 需要知道脚本当前运行的位置 需要基于当前目录构建相对路径 调试时确认程序的工作目录是否正确 os.getcwd() 返回的是字符串形式的绝对路径。 import os current_dir = os.getcwd() print(f”当前工作目录: {current_dir}”)
- 需求场景: 需要切换到特定目录进行操作 处理相对路径前确保在正确的目录下 临时切换到某个目录处理文件后又需要返回原目录 os.chdir() 会改变当前进程的工作目录。如果目标目录不存在会抛出 FileNotFoundError os.chdir(‘/path/to/new/directory’) print(f”新工作目录: {os.getcwd()}”)
- 需求场景: 构建跨平台的路径时(Windows用,Linux和Mac用/) 动态组合路径各部分 避免手动拼接路径导致的错误 使用 os.path.join() 可以安全地拼接路径,它会自动处理不同操作系统的路径分隔符。 path = os.path.join(‘folder’, ‘subfolder’, ‘file.txt’) print(f”拼接后的路径: {path}”) # 在Windows上输出: foldersubfolderfile.txt # 在Linux/Mac上输出: folder/subfolder/file.txt
- 需求场景: 需要单独获取文件名或目录名 批量处理文件扩展名 分析用户提供的文件路径 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
- 需求场景: 处理输入路径前验证有效性 确保文件/目录存在再进行操作 编写安装脚本时需要检查目标位置 这些检查函数不会抛出异常,而是返回布尔值。对于符号链接,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)}”)
- 需求场景: 程序需要生成输出目录 安装程序创建必要的目录结构 上传文件前确保目标目录存在 os.mkdir() 只能创建单级目录,如果父目录不存在会抛出 FileNotFoundError。而 os.makedirs()可以递归创建多级目录,exist_ok=True 参数使得目录已存在时不会报错。 # 创建单个目录 os.mkdir(‘new_directory’) # 创建多级目录 os.makedirs(‘parent/child/grandchild’, exist_ok=True) # exist_ok=True 避免目录已存在时报错
- 需求场景: 清理临时目录 卸载程序删除相关目录 定期清理旧数据 os.rmdir()只能删除空目录,否则会抛出 OSError。要删除非空目录需要使用 shutil.rmtree(),它会递归删除整个目录树,使用时需特别小心。 # 删除空目录 os.rmdir(’empty_directory’) # 删除目录树 (谨慎使用!) import shutil shutil.rmtree(‘directory_with_contents’)
- 需求场景: 批量处理目录中的文件 实现文件搜索功能 统计目录内容 备份目录结构 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)
- 需求场景: 批量重命名文件 添加时间戳到文件名 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)
- 需求场景: 清理临时文件 实现文件删除功能 定期清理旧文件 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)
- 需求场景: 显示文件详细信息 按大小/时间筛选文件 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}”)
- 需求场景: 整理照片库(添加日期/地点前缀) 标准化下载的文件名 批量修改项目中的资源文件名 示例展示了如何批量修改文件名。在实际应用中,可以扩展为更复杂的重命名规则,如添加序号、修改扩展名、根据文件内容重命名等。 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_’)
- 需求场景: 收集所有日志文件(.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)
- 需求场景: 实现磁盘空间检查功能 限制用户上传目录的大小 分析项目各模块占用空间 这个函数计算的是目录中所有文件的实际大小总和,不包括目录元数据占用的空间。跳过了符号链接以避免重复计算或无限递归。对于非常大的目录,可能需要优化性能。 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 模块是什么
- 二、路径操作
- 1. 获取当前工作目录
- 2. 改变工作目录
- 3. 路径拼接
- 4. 路径分解与提取
- 5. 路径有效性检查
- 三、目录操作
- 1. 创建目录
- 2. 删除目录
- 3. 遍历目录
- 四、文件操作
- 1. 文件重命名
- 2. 删除文件
- 3. 获取文件信息
- 五、环境变量操作
- 六、跨平台路径处理
- 七、实用示例
- 示例1:批量重命名文件
- 示例2:查找特定扩展名的文件
- 示例3:计算目录大小
- 八、安全注意事项
- 九、总结
os 模块是Python标准库的一部分,无需额外安装即可使用。它封装了不同操作系统(Windows、Linux、MacOS等)的底层系统调用,提供了一致的接口使用,它可以让我们在Python中执行各种操作系统级别的任务,如创建/删除目录、遍历文件系统、管理文件路径等。
需求场景:
- 需要知道脚本当前运行的位置
- 需要基于当前目录构建相对路径
- 调试时确认程序的工作目录是否正确
os.getcwd() 返回的是字符串形式的绝对路径。
import os
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
需求场景:
- 需要切换到特定目录进行操作
- 处理相对路径前确保在正确的目录下
- 临时切换到某个目录处理文件后又需要返回原目录
os.chdir() 会改变当前进程的工作目录。如果目标目录不存在会抛出 FileNotFoundError
os.chdir('/path/to/new/directory')
print(f"新工作目录: {os.getcwd()}")
需求场景:
- 构建跨平台的路径时(Windows用,Linux和Mac用/)
- 动态组合路径各部分
- 避免手动拼接路径导致的错误
使用 os.path.join() 可以安全地拼接路径,它会自动处理不同操作系统的路径分隔符。
path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"拼接后的路径: {path}")
# 在Windows上输出: foldersubfolderfile.txt
# 在Linux/Mac上输出: folder/subfolder/file.txt
需求场景:
- 需要单独获取文件名或目录名
- 批量处理文件扩展名
- 分析用户提供的文件路径
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
需求场景:
- 处理输入路径前验证有效性
- 确保文件/目录存在再进行操作
- 编写安装脚本时需要检查目标位置
这些检查函数不会抛出异常,而是返回布尔值。对于符号链接,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)}")
需求场景:
- 程序需要生成输出目录
- 安装程序创建必要的目录结构
- 上传文件前确保目标目录存在
os.mkdir() 只能创建单级目录,如果父目录不存在会抛出 FileNotFoundError。而 os.makedirs()可以递归创建多级目录,exist_ok=True 参数使得目录已存在时不会报错。
# 创建单个目录
os.mkdir('new_directory')
# 创建多级目录
os.makedirs('parent/child/grandchild', exist_ok=True) # exist_ok=True 避免目录已存在时报错
需求场景:
- 清理临时目录
- 卸载程序删除相关目录
- 定期清理旧数据
os.rmdir()只能删除空目录,否则会抛出 OSError。要删除非空目录需要使用 shutil.rmtree(),它会递归删除整个目录树,使用时需特别小心。
# 删除空目录
os.rmdir('empty_directory')
# 删除目录树 (谨慎使用!)
import shutil
shutil.rmtree('directory_with_contents')
需求场景:
- 批量处理目录中的文件
- 实现文件搜索功能
- 统计目录内容
- 备份目录结构
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)
需求场景:
- 批量重命名文件
- 添加时间戳到文件名
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)
需求场景:
- 清理临时文件
- 实现文件删除功能
- 定期清理旧文件
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)
需求场景:
- 显示文件详细信息
- 按大小/时间筛选文件
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
需求场景:
- 整理照片库(添加日期/地点前缀)
- 标准化下载的文件名
- 批量修改项目中的资源文件名
示例展示了如何批量修改文件名。在实际应用中,可以扩展为更复杂的重命名规则,如添加序号、修改扩展名、根据文件内容重命名等。
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_')
需求场景:
- 收集所有日志文件(.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)
需求场景:
- 实现磁盘空间检查功能
- 限制用户上传目录的大小
- 分析项目各模块占用空间
这个函数计算的是目录中所有文件的实际大小总和,不包括目录元数据占用的空间。跳过了符号链接以避免重复计算或无限递归。对于非常大的目录,可能需要优化性能。
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 处理可能的异常
os.path 而不是手动拼接路径,确保跨平台兼容性try-except 处理可能的异常文件操作可能引发多种异常,如权限不足、文件不存在、路径无效等。对于关键操作,建议先检查再执行,并做好异常处理。
try:
os.remove('important_file.txt')
except FileNotFoundError:
print("文件不存在,无需删除")
except PermissionError:
print("没有删除文件的权限")
掌握Python 的 os 模块,为操作文件和目录提供更多便利:
- 安全地处理各种路径操作
- 创建、删除和遍历目录结构
- 管理文件和获取文件信息
- 访问和修改环境变量
- 编写跨平台的脚本
在实际开发中,可以根据具体需求选择合适的函数,并注意异常处理和跨平台兼容性。
以上就是Python使用os模块操作文件与目录的完整指南的详细内容,更多关于Python os模块操作文件与目录的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python使用os模块进行高级文件操作的详细指南(遍历、移动、复制和删除文件和目录)
- 关于Python OS模块常用文件/目录函数详解
- python文件目录操作之os模块
- Python使用os模块和fileinput模块来操作文件目录