Python自动化办公应用学习笔记42——os模块2
六、系统信息
属性/方法 | 说明 | 示例输出 | 平台差异 |
os.name | 操作系统类型 | 'nt' (Windows) / 'posix' (Linux/Mac) | 核心标识 |
os.environ | 环境变量字典 | print(os.environ['PATH']) | 可修改 |
os.getlogin() | 当前登录用户 | user = os.getlogin() | Windows/Linux |
os.cpu_count() | CPU核心数 | print(os.cpu_count()) → 8 | 无 |
os.sep | 路径分隔符 | \ (Windows) / (Linux) | 跨平台开发重要 |
七、进程管理
方法 | 说明 | 示例 | 风险等级 |
os.system(command) | 执行系统命令 | os.system("calc.exe") | 中 (避免用户输入) |
os.startfile(path) | 用关联程序打开 | os.startfile("report.pdf") | 低 |
os.popen(command) | 执行命令并获取输出 | output = os.popen("dir").read() | 高 (潜在注入风险) |
os.kill(pid, sig) | 结束进程 | os.kill(1234, 9) | 高 (需进程ID) |
# 禁止直接执行用户输入的指令
user_input = input("请输入命令:") # 危险操作!
os.system(user_input) # 可能执行恶意命令
八、目录遍历
os.walk(top) - 递归遍历目录树
for root, dirs, files in os.walk("Project", topdown=True):
print(f"当前目录: {root}")
print(f"包含子目录: {dirs}") # 可修改实现过滤
print(f"包含文件: {files}")
print("-" * 30)
参数说明:
topdown=False:自底向上遍历
修改dirs列表可实现目录过滤
# 跳过.git目录
if '.git' in dirs:
dirs.remove('.git') # 修改后walk将跳过
九、文件元数据
方法 | 说明 | 示例 | 返回值处理 |
os.path.getsize(p) | 文件大小(字节) | size = path.getsize("data.zip") | 需格式化显示 |
os.path.getmtime(p) | 最后修改时间 | mtime = path.getmtime("log.txt") | 时间戳格式 |
os.path.getctime(p) | 创建时间 | ctime = path.getctime("file.doc") | Windows专用 |
os.stat(path) | 获取完整属性 | info = os.stat("data.bin") | 返回stat对象 |
# 格式化显示文件信息
from datetime import datetime
mtime = path.getmtime("report.docx")
print("最后修改:", datetime.fromtimestamp(mtime).strftime("%Y-%m-%d %H:%M"))
print("文件大小:", round(path.getsize("report.docx")/1024, 2), "KB")
实践技巧
1. 路径拼接:始终使用os.path.join()
"folder" + "/" + "file.txt"
path.join("folder", "file.txt")
2. 路径检查:操作前验证
target = "important.xlsx"
if not path.exists(target):
print(f"警告: {target} 不存在!")
3. 递归操作:优先用os.walk()而非手动递归
4. 批量处理:os.listdir() + path.join()黄金组合
for file in os.listdir("docs"):
full_path = path.join("docs", file) # 关键步骤
if path.isfile(full_path):
process_file(full_path)
5. 安全删除:先验证类型再操作
def safe_remove(target):
if path.isfile(target):
os.remove(target)
elif path.isdir(target):
shutil.rmtree(target) # 需import shutil
6. 跨平台开发:
使用os.sep替代硬编码分隔符
避免Windows路径驱动符(C:)
7. 环境变量:
# 安全获取环境变量
home_dir = os.environ.get('HOME', os.environ.get('USERPROFILE', ''))
8. 时间处理:
from datetime import datetime
mtime = datetime.fromtimestamp(path.getmtime("file"))
9. 错误处理:
try:
os.mkdir("new_dir")
except FileExistsError:
print("目录已存在")
10. 替代方案:
复杂操作用shutil模块(文件复制/压缩等)
路径操作用pathlib(面向对象路径处理)
典型应用场景
1. 批量重命名
# 给PDF文件添加日期前缀
for filename in os.listdir("invoices"):
if filename.lower().endswith(".pdf"):
new_name = f"2023_{filename}"
os.rename(
path.join("invoices", filename),
path.join("invoices", new_name)
)
2. 清理临时文件
# 删除超过30天的临时文件
import time
now = time.time()
for file in os.listdir("temp"):
file_path = path.join("temp", file)
if path.isfile(file_path):
if now - path.getmtime(file_path) > 30*86400: # 30天
os.remove(file_path)
3. 构建项目结构
# 创建标准项目目录
project_dirs = ["docs", "src", "data/raw", "data/processed"]
for dir in project_dirs:
os.makedirs(path.join("new_project", dir), exist_ok=True)
终极提示
1. 路径处理推荐使用原始字符串:r"C:\data"
2. 在Python 3.4+中,pathlib模块提供更面向对象的路径操作
from pathlib import Path
Path("docs") / "report.docx" # 更直观的路径操作
3. 危险操作(如删除、执行命令)务必添加确认环节