1. os模块是什么?
os
模块是Python标准库中用于与操作系统交互的核心模块,提供了丰富的函数来执行文件操作、目录操作、进程管理等系统级任务。
2. 特点
- 跨平台性:支持Windows、Linux、macOS等主流操作系统
- 功能全面:覆盖文件系统、进程管理、环境变量等核心功能
- 底层接口:提供接近操作系统底层的API
- 标准库集成:Python安装自带,无需额外安装
3. 优势
4. 当前状态
1. 目录操作
基本用法
import os
# 创建目录(单级)
os.mkdir("new_directory")
# 创建多级目录
os.makedirs("parent/child/grandchild", exist_ok=True)
# 删除目录(空目录)
os.rmdir("empty_dir")
# 递归删除空目录
os.removedirs("a/b/c") # 从c开始删除空目录
注意事项
exist_ok=True
- 使用
os.path.exists()
检查目录是否存在
2. 文件操作
# 重命名文件/目录
os.rename("old.txt", "new.txt")
# 删除文件
os.remove("unwanted_file.txt")
# 获取文件属性
file_stat = os.stat("example.txt")
print(f"大小: {file_stat.st_size} bytes")
print(f"修改时间: {file_stat.st_mtime}")
编程技巧
1. 核心功能
2. 详细用法
# 路径拼接
full_path = os.path.join("dir", "subdir", "file.txt")
# 路径解析
print(os.path.basename(full_path)) # file.txt
print(os.path.dirname(full_path)) # dir/subdir
# 路径分割
dir_part, file_part = os.path.split(full_path)
name, ext = os.path.splitext(file_part)
# 路径检测
print(os.path.exists(full_path))
print(os.path.isfile(full_path))
print(os.path.isdir(full_path))
3. 注意事项
- 使用
os.path.join()
代替字符串拼接 - 注意路径大小写敏感问题(Linux vs Windows)
1. 基本功能
# 执行系统命令
exit_code = os.system("ls -l")
# 获取环境变量
print(os.getenv("PATH"))
# 设置环境变量(当前进程有效)
os.environ["CUSTOM_VAR"] = "value"
# 获取当前进程ID
print(f"PID: {os.getpid()}")
2. 高级应用
# 运行程序并获取输出(Python 3.5+)
import subprocess
result = subprocess.run(
["python", "--version"],
capture_output=True,
text=True,
check=True
)
print(result.stdout)
注意事项
1. 核心函数
# 操作系统类型
print(os.name) # 'posix'(Linux/macOS)或 'nt'(Windows)
# 当前工作目录
print(os.getcwd())
# 更改工作目录
os.chdir("/path/to/new/directory")
# CPU核心数
print(os.cpu_count())
# 文件系统编码
print(os.fsencode("文件名.txt")) # 处理特殊字符
2. 使用场景举例
1. 低级文件I/O
# 打开文件(低级API)
fd = os.open("data.bin", os.O_RDWR | os.O_CREAT)
# 读写操作
os.write(fd, b"Binary data")
os.lseek(fd, 0, os.SEEK_SET) # 移动指针
data = os.read(fd, 100)
# 关闭文件
os.close(fd)
2. 应用场景
注意事项
1. 权限管理
# 修改文件权限(Linux/macOS)
os.chmod("script.sh", 0o755) # 可执行权限
# 修改文件所有者
os.chown("file.txt", uid, gid) # Unix系统
2. 安全实践
# 安全路径检查
def safe_open(path):
if not os.path.abspath(path).startswith("/safe/directory"):
raise ValueError("非法路径访问")
return open(path)
3. 临时文件处理
import tempfile
# 安全创建临时文件
with tempfile.NamedTemporaryFile(delete=True) as tmp:
tmp.write(b"Temporary data")
tmp.flush()
# 使用临时文件...
# 自动删除
1. 需求分析
2. 代码实现
import os
import shutil
import datetime
import hashlib
defbackup_directory(source, destination):
"""备份目录并生成校验报告"""
# 创建备份目录
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = os.path.join(destination, f"backup_{timestamp}")
os.makedirs(backup_path, exist_ok=True)
# 初始化日志
log_path = os.path.join(backup_path, "backup_log.txt")
report = []
# 遍历源目录
file_count = 0
total_size = 0
for root, dirs, files in os.walk(source):
# 在备份中创建对应目录
rel_path = os.path.relpath(root, source)
dest_dir = os.path.join(backup_path, rel_path)
os.makedirs(dest_dir, exist_ok=True)
for file in files:
src_file = os.path.join(root, file)
dest_file = os.path.join(dest_dir, file)
# 复制文件
shutil.copy2(src_file, dest_file)
# 计算文件哈希
withopen(src_file, "rb") as f:
file_hash = hashlib.md5(f.read()).hexdigest()
# 记录信息
file_stat = os.stat(src_file)
report.append({
"source": src_file,
"destination": dest_file,
"size": file_stat.st_size,
"modified": file_stat.st_mtime,
"hash": file_hash
})
file_count += 1
total_size += file_stat.st_size
# 写入日志
withopen(log_path, "w") as log:
log.write(f"Backup Report - {timestamp}\n")
log.write(f"Source: {source}\n")
log.write(f"Destination: {backup_path}\n")
log.write(f"Files: {file_count}\n")
log.write(f"Total Size: {total_size / (1024*1024):.2f} MB\n\n")
for entry in report:
log.write(f"{entry['source']} -> {entry['destination']}\n")
log.write(f" Size: {entry['size']} bytes\n")
log.write(f" Modified: {datetime.datetime.fromtimestamp(entry['modified'])}\n")
log.write(f" MD5: {entry['hash']}\n\n")
print(f"备份完成! 文件数: {file_count}, 总大小: {total_size / (1024*1024):.2f} MB")
print(f"日志文件: {log_path}")
if __name__ == "__main__":
source_dir = input("请输入源目录: ").strip()
backup_dir = input("请输入备份目录: ").strip()
ifnot os.path.isdir(source_dir):
print("错误: 源目录不存在")
elifnot os.path.isdir(backup_dir):
print("错误: 备份目录不存在")
else:
backup_directory(source_dir, backup_dir)
3. 功能简介
1. 安全规范
- 使用
os.path.abspath()
解析绝对路径
2. 跨平台技巧
# 跨平台路径处理
config_file = os.path.join(os.getenv("APPDATA", os.path.expanduser("~")), "app_config.ini")
# 跨平台文件操作
if os.name == "nt":
# Windows特定代码
else:
# Unix/Linux特定代码
3. 性能优化
- 批量操作时使用
os.scandir()
代替os.listdir()
- 避免在循环中重复调用
os.path.exists()
4. 替代方案
# 使用pathlib(Python 3.4+)
from pathlib import Path
# 创建目录
Path("new/dir").mkdir(parents=True, exist_ok=True)
# 文件操作
file = Path("data.txt")
content = file.read_text()
os
模块提供了与操作系统交互的丰富接口。通过本教程,我们可以学到:
掌握os
模块可以大幅提升Python在系统管理、文件操作和自动化任务方面的能力。建议结合shutil
、pathlib
等模块使用,构建更健壮的应用程序。
阅读原文:原文链接
该文章在 2025/7/18 10:52:10 编辑过