当前位置: 首页 > news >正文

Python 第十五节 OS文件操作相关方法用途详解

前言

PythonOS文件操作相关方法用途及功能。该模块可跨平台与操作系统交互,支持文件、目录操作等。可以进行工作目录的获取与切换、目录内容的列出、目录的创建与删除、文件的删除与重命名,以及环境变量获取和系统命令执行的相关操作

1. 导入 OS 模块

import os

2. 文件操作

2.1 文件重命名

# 重命名文件
os.rename('old_name.txt', 'new_name.txt')# 安全的重命名(如果目标存在则覆盖)
os.replace('old_name.txt', 'new_name.txt')

注意事项:

  1. 如果目标文件已存在,rename() 可能失败
  2. replace() 在目标存在时会覆盖,更安全
  3. 跨文件系统重命名可能失败

2.2 删除文件

# 删除文件
os.remove('file.txt')# 如果文件不存在会抛出异常,建议先检查
if os.path.exists('file.txt'):os.remove('file.txt')

2.3 获取文件信息

    import time# 获取文件状态file_stat = os.stat('file.txt')print(f"文件大小: {file_stat.st_size} bytes")print(f"最后修改时间: {time.ctime(file_stat.st_mtime)}")print(f"最后访问时间: {time.ctime(file_stat.st_atime)}")

3. 目录操作

3.1 创建目录

    # 创建单个目录os.mkdir('new_directory')# 递归创建多级目录os.makedirs('path/to/nested/directory', exist_ok=True)# 创建目录并设置权限(Unix系统)os.mkdir('secure_dir', mode=0o755)

注意事项:

  1. mkdir() 只能创建单级目录
  2. makedirs() 可以创建多级目录
  3. 使用 exist_ok=True 避免目录已存在时的异常

3.2 删除目录

    # 删除空目录os.rmdir('empty_directory')# 递归删除目录树(危险操作)import shutilshutil.rmtree('directory_to_remove')# 安全删除空目录if os.path.exists('dir') and os.path.isdir('dir'):try:os.rmdir('dir')except OSError as e:print(f"目录非空: {e}")

3.3 遍历目录

    # 列出目录内容items = os.listdir('.')print("当前目录内容:", items)# 使用 scandir()(更高效)with os.scandir('.') as entries:for entry in entries:if entry.is_file():print(f"文件: {entry.name}")elif entry.is_dir():print(f"目录: {entry.name}")# 递归遍历目录树for root, dirs, files in os.walk('.'):print(f"当前目录: {root}")print(f"子目录: {dirs}")print(f"文件: {files}")print("-" * 40)

4. 路径操作

4.1 路径拼接和分解

    # 安全的路径拼接full_path = os.path.join('folder', 'subfolder', 'file.txt')print(f"完整路径: {full_path}")# 路径分解directory, filename = os.path.split('/path/to/file.txt')print(f"目录: {directory}, 文件名: {filename}")name, extension = os.path.splitext('document.pdf')print(f"文件名: {name}, 扩展名: {extension}")

4.2 路径检查

    path = '/path/to/some/file.txt'print(f"是否存在: {os.path.exists(path)}")print(f"是文件: {os.path.isfile(path)}")print(f"是目录: {os.path.isdir(path)}")print(f"是链接: {os.path.islink(path)}")print(f"绝对路径: {os.path.abspath(path)}")

5. 环境和工作目录

5.1 工作目录操作

    # 获取当前工作目录current_dir = os.getcwd()print(f"当前目录: {current_dir}")# 改变工作目录os.chdir('/new/directory/path')# 临时改变工作目录(推荐)original_dir = os.getcwd()try:os.chdir('/temp/path')# 执行操作finally:os.chdir(original_dir)  # 确保恢复原目录

5.2 环境变量

    # 获取环境变量home_dir = os.getenv('HOME')path_var = os.getenv('PATH', '默认值')  # 提供默认值# 设置环境变量(当前进程有效)os.environ['MY_VAR'] = 'my_value'# 获取所有环境变量for key, value in os.environ.items():print(f"{key}: {value}")

6. 高级文件操作

6.1 文件权限管理

    import stat# 设置文件权限os.chmod('file.txt', stat.S_IRUSR | stat.S_IWUSR)  # 用户读写# 检查文件权限file_mode = os.stat('file.txt').st_modeif file_mode & stat.S_IRUSR:print("用户有读权限")

6.2 创建临时文件

import tempfile# 创建临时文件(自动删除)
with tempfile.NamedTemporaryFile(mode='w+', delete=True) as temp_file:temp_file.write("临时内容")temp_file.seek(0)print(temp_file.read())# 创建临时目录
with tempfile.TemporaryDirectory() as temp_dir:print(f"临时目录: {temp_dir}")# 在临时目录中工作

7. 综合案例

7.1 文件备份工具

import os
import shutil
from datetime import datetimedef backup_file(source_path, backup_dir):"""备份文件到指定目录"""if not os.path.isfile(source_path):print(f"错误: {source_path} 不是文件")return False# 创建备份目录os.makedirs(backup_dir, exist_ok=True)# 生成备份文件名timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = os.path.basename(source_path)backup_name = f"{os.path.splitext(filename)[0]}_{timestamp}{os.path.splitext(filename)[1]}"backup_path = os.path.join(backup_dir, backup_name)try:shutil.copy2(source_path, backup_path)print(f"备份成功: {backup_path}")return Trueexcept Exception as e:print(f"备份失败: {e}")return False# 使用示例
backup_file('important_document.txt', './backups')

7.2 目录大小计算

def get_directory_size(directory):"""计算目录总大小"""total_size = 0for dirpath, dirnames, filenames in os.walk(directory):for filename in filenames:filepath = os.path.join(dirpath, filename)if os.path.isfile(filepath):total_size += os.path.getsize(filepath)return total_sizedef format_size(size_bytes):"""格式化文件大小"""for unit in ['B', 'KB', 'MB', 'GB']:if size_bytes < 1024.0:return f"{size_bytes:.2f} {unit}"size_bytes /= 1024.0return f"{size_bytes:.2f} TB"# 使用示例
directory = '.'
size = get_directory_size(directory)
print(f"目录 {directory} 大小: {format_size(size)}")

7.3 文件查找工具

def find_files(directory, pattern=None, file_type='both'):"""在目录中查找文件file_type: 'file', 'dir', 'both'"""matches = []for root, dirs, files in os.walk(directory):if file_type in ['file', 'both']:for file in files:if pattern is None or pattern in file:matches.append(os.path.join(root, file))if file_type in ['dir', 'both']:for dir_name in dirs:if pattern is None or pattern in dir_name:matches.append(os.path.join(root, dir_name))return matches# 使用示例
python_files = find_files('.', '.py', 'file')
print("找到的Python文件:")
for file in python_files:print(f"  {file}")

8. 重要注意事项

8.1 安全性

    # 不安全的路径拼接(可能遭受路径遍历攻击)user_input = "../../etc/passwd"unsafe_path = os.path.join('/safe/dir', user_input)  # 危险!# 安全的路径处理def safe_join(base_dir, user_path):full_path = os.path.join(base_dir, user_path)full_path = os.path.normpath(full_path)if not full_path.startswith(os.path.abspath(base_dir)):raise ValueError("路径遍历攻击检测!")return full_path

8.2 错误处理

import errnodef safe_file_operations():try:# 文件操作with open('file.txt', 'r') as f:content = f.read()# 目录操作os.mkdir('new_dir')except FileNotFoundError:print("文件或目录不存在")except PermissionError:print("权限不足")except OSError as e:if e.errno == errno.ENOSPC:print("磁盘空间不足")else:print(f"系统错误: {e}")except Exception as e:print(f"未知错误: {e}")safe_file_operations()

8.3 跨平台兼容性

    # 使用 os.path 处理路径,不要硬编码分隔符bad_path = "folder\\subfolder\\file.txt"  # Windows专用good_path = os.path.join("folder", "subfolder", "file.txt")  # 跨平台# 检查操作系统if os.name == 'nt':  # Windowsprint("运行在Windows系统")elif os.name == 'posix':  # Linux/Unix/Macprint("运行在Unix-like系统")

Python OS 模块的主要功能,使用时需要注意错误处理、安全性和跨平台兼容性。

http://www.dtcms.com/a/495037.html

相关文章:

  • 动态规划的“递归之舞”:破解字符串的深层结构——扰乱字符串
  • 淮北市做网站最好的公司上海网站搭建平台公司
  • 网站域名设计推荐新华网海南频道
  • InternVL3.5多模态多大模型改进点及视觉分辨率路由模块技术浅尝
  • 人工智能基础知识笔记十八:Prompt Engineering
  • 深入理解Shell与反弹Shell:从原理到实战
  • LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
  • EvalScope模型压力测试实战
  • 极速网站建设服务商厦门网站建设网络推广
  • 新建网站如何调试网页设计公司的调研
  • 模拟oracle 索引平衡树叶子节点
  • Android 内存优化
  • Java JVM “垃圾回收(GC)”面试清单(含超通俗生活案例与深度理解)
  • Python快速落地的临床知识问答与检索项目(2025年9月教学实现部分)
  • 从0到1掌握Spring Boot自动配置:自定义配置实战指南
  • 索引设计速查:哪些字段该建索引?哪些不能建?
  • 自己的主机做网站服务器小树建站平台
  • 英集芯-IP5385开发调试总结
  • ProfiNet转EtherNet/IP工业PLC网关:打通仓储PLC与机器人通讯链路
  • Linux C/C++ 学习日记(27):KCP协议(三):代码结构分析与使用示例
  • 系统移植篇之uboot-5:DDR内存
  • 新开传奇网站刚开上海软件开发公司排名
  • C语言之可变参函数
  • Centos 7 环境下mysql的安装及配置
  • CentOS修改MySQL数据目录后重启失败的问题及解决方案
  • 南宁市优化网站宜昌网站建设
  • 医药网站 备案做哪个网站的直播好
  • 永磁同步电机电流环低“采样与基频比率”(S2F)性能影响与改进
  • Vue3 - defineExpose的使用
  • Go Web 编程快速入门 01 - 环境准备与第一个 Web 应用