一、os模块概述
os 模块提供了与操作系统交互的接口,封装了跨平台的系统调用。通过 os 模块,可以执行文件和目录操作、获取环境变量、管理进程等。
二、os模块常用功能
2.1 文件和目录操作
| |
os.getcwd() | |
os.chdir(path) | |
os.listdir(path) | |
os.mkdir(path) | |
os.makedirs(path) | |
os.rmdir(path) | |
os.removedirs(path) | |
os.remove(path) | |
os.rename(src, dst) | |
os.stat(path) | |
import os
# 当前工作目录
print(os.getcwd()) # /home/user/project
# 列出当前目录内容
for item in os.listdir('.'):
print(item)
# 创建目录
os.makedirs('data/2025/logs', exist_ok=True)
# 重命名
os.rename('old.txt', 'new.txt')
# 获取文件信息
info = os.stat('test.txt')
print(f"大小: {info.st_size} 字节")
print(f"修改时间: {info.st_mtime}")
2.2 路径操作(os.path子模块)
| |
os.path.join(a, b) | |
os.path.exists(path) | |
os.path.isfile(path) | |
os.path.isdir(path) | |
os.path.abspath(path) | |
os.path.basename(path) | |
os.path.dirname(path) | |
os.path.splitext(path) | |
os.path.getsize(path) | |
import os
# 路径拼接
path = os.path.join('data', 'logs', 'app.log')
print(path) # data/logs/app.log (Linux) 或 data\logs\app.log (Windows)
# 判断存在性
if os.path.exists('config.ini'):
print('配置文件存在')
# 拆分路径
filepath = '/home/user/data.txt'
print(os.path.basename(filepath)) # data.txt
print(os.path.dirname(filepath)) # /home/user
print(os.path.splitext(filepath)) # ('/home/user/data', '.txt')
2.3 环境变量
| |
os.environ | |
os.getenv(key, default) | |
os.putenv(key, value) | |
import os
# 获取环境变量
python_path = os.environ.get('PYTHONPATH', '/default/path')
home = os.getenv('HOME', '/home/user')
# 设置环境变量(仅当前进程有效)
os.environ['MY_APP_MODE'] = 'development'
# 遍历环境变量
for key, value in os.environ.items():
print(f"{key}={value}")
2.4 进程管理
| |
os.system(command) | |
os.popen(command) | |
os.getpid() | |
os.getppid() | |
os.kill(pid, sig) | |
import os
# 执行系统命令
os.system('ls -la') # Linux
# os.system('dir') # Windows
# 获取命令输出
with os.popen('date') as f:
output = f.read()
print(output)
print(f"当前进程ID: {os.getpid()}")
2.5 跨平台差异处理
import os
# 路径分隔符
print(os.sep) # '/' (Linux) 或 '\\' (Windows)
print(os.pathsep) # ':' (Linux) 或 ';' (Windows)
# 换行符
print(os.linesep) # '\n' (Linux) 或 '\r\n' (Windows)
# 判断操作系统
if os.name == 'posix':
print("Linux/Mac系统")
elif os.name == 'nt':
print("Windows系统")
三、sys模块概述
sys 模块提供了Python解释器相关的变量和函数,用于控制运行时环境、访问命令行参数、处理标准输入输出等。
四、sys模块常用功能
4.1 命令行参数
import sys
# 执行: python script.py arg1 arg2 -v
print(f"脚本名: {sys.argv[0]}")
print(f"参数列表: {sys.argv[1:]}")
# 简单参数解析
iflen(sys.argv) < 2:
print("用法: python script.py <name>")
sys.exit(1)
name = sys.argv[1]
print(f"Hello, {name}")
4.2 标准输入输出错误
| |
sys.stdin | |
sys.stdout | |
sys.stderr | |
import sys
# 重定向输出
sys.stdout.write("Hello\n") # 等同于 print("Hello")
# 错误输出
sys.stderr.write("错误信息\n")
# 读取所有输入
data = sys.stdin.read()
# 逐行读取
for line in sys.stdin:
print(f"读取: {line.strip()}")
4.3 解释器信息
| |
sys.version | |
sys.version_info | |
sys.platform | |
sys.executable | |
sys.path | |
sys.modules | |
import sys
print(f"Python版本: {sys.version}")
print(f"版本信息: {sys.version_info.major}.{sys.version_info.minor}")
print(f"平台: {sys.platform}")
print(f"解释器路径: {sys.executable}")
# 查看模块搜索路径
for path in sys.path:
print(path)
# 添加自定义搜索路径
sys.path.append('/path/to/my/modules')
4.4 程序退出
import sys
defmain():
if error_occurred:
sys.exit(1) # 非0表示错误
sys.exit(0) # 0表示成功
if __name__ == "__main__":
main()
4.5 其他常用功能
| |
sys.getrecursionlimit() | |
sys.setrecursionlimit(n) | |
sys.getsizeof(obj) | |
sys.intern(str) | |
import sys
# 递归深度限制
print(sys.getrecursionlimit()) # 默认1000
sys.setrecursionlimit(3000)
# 内存大小
lst = [1, 2, 3]
print(sys.getsizeof(lst)) # 列表对象本身的大小
# 字符串驻留(节省内存)
s1 = sys.intern('hello')
s2 = sys.intern('hello')
print(s1 is s2) # True
五、os与sys对比
六、实战案例
6.1 批量文件重命名(os)
import os
defbatch_rename(directory, prefix):
"""批量添加文件前缀"""
for filename in os.listdir(directory):
old_path = os.path.join(directory, filename)
if os.path.isfile(old_path):
new_name = prefix + filename
new_path = os.path.join(directory, new_name)
os.rename(old_path, new_path)
print(f"{filename} -> {new_name}")
# batch_rename('./docs', 'backup_')
6.2 递归遍历目录(os.walk)
import os
deffind_files(root_dir, extension):
"""递归查找指定扩展名的文件"""
matches = []
for dirpath, dirnames, filenames in os.walk(root_dir):
for filename in filenames:
if filename.endswith(extension):
full_path = os.path.join(dirpath, filename)
matches.append(full_path)
return matches
# 查找所有 .py 文件
py_files = find_files('.', '.py')
for f in py_files:
print(f)
6.3 命令行工具(sys.argv)
import sys
defword_count():
"""统计文件的行数、单词数、字符数"""
iflen(sys.argv) != 2:
print("用法: python wc.py <filename>")
sys.exit(1)
filename = sys.argv[1]
try:
withopen(filename, 'r', encoding='utf-8') as f:
content = f.read()
lines = content.count('\n')
words = len(content.split())
chars = len(content)
print(f"行数: {lines}")
print(f"单词数: {words}")
print(f"字符数: {chars}")
except FileNotFoundError:
print(f"文件 {filename} 不存在")
sys.exit(1)
# word_count()
6.4 进度条(sys.stdout)
import sys
import time
defprogress_bar(total, width=50):
"""显示进度条"""
for i inrange(total + 1):
percent = i / total
filled = int(width * percent)
bar = '█' * filled + '░' * (width - filled)
sys.stdout.write(f'\r进度: |{bar}| {percent:.1%}')
sys.stdout.flush()
time.sleep(0.1)
print()
# progress_bar(100)
6.5 环境变量配置管理(os.environ)
import os
classConfig:
def__init__(self):
self.DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'
self.HOST = os.getenv('HOST', 'localhost')
self.PORT = int(os.getenv('PORT', 8080))
self.DATABASE_URL = os.getenv('DATABASE_URL', 'sqlite:///app.db')
def__repr__(self):
returnf"Config(DEBUG={self.DEBUG}, HOST={self.HOST}, PORT={self.PORT})"
# 设置环境变量
os.environ['DEBUG'] = 'true'
os.environ['PORT'] = '9000'
config = Config()
print(config) # Config(DEBUG=True, HOST=localhost, PORT=9000)
6.6 内存监控(sys.getsizeof)
import sys
defmemory_profile(data):
"""分析对象内存占用"""
print(f"类型: {type(data).__name__}")
print(f"大小: {sys.getsizeof(data)} 字节")
# 对容器类型递归分析
ifisinstance(data, (list, tuple, set)):
total = sys.getsizeof(data)
for i, item inenumerate(data):
item_size = sys.getsizeof(item)
total += item_size
print(f" 元素[{i}]: {item_size} 字节")
print(f"总内存: {total} 字节")
elifisinstance(data, dict):
total = sys.getsizeof(data)
for key, value in data.items():
total += sys.getsizeof(key) + sys.getsizeof(value)
print(f"总内存: {total} 字节")
data = [1, 2, 3, 'hello', [4, 5]]
memory_profile(data)
七、注意事项
- 1. 跨平台兼容:使用
os.path.join() 而不是手动拼接路径;使用 os.sep 而不是硬编码 / 或 \。 - 2. 路径编码:Windows 路径可能包含中文,使用
os.path 函数能正确处理。 - 3. 权限问题:文件操作可能引发
PermissionError,需要异常处理。 - 4. 环境变量修改:
os.environ 的修改只影响当前进程,不影响系统环境。 - 5.
sys.path 修改:临时添加路径后,记得在需要时移除或使用上下文管理。 - 6.
sys.exit() 异常:sys.exit() 会抛出 SystemExit 异常,可以被 try...except 捕获。 - 7. 递归深度:修改递归深度需谨慎,可能导致栈溢出。
八、总结
| | |
os | | os.path, os.listdir, os.environ, os.system |
sys | | sys.argv, sys.path, sys.exit, sys.stdout |
核心要点:
- •
os 模块用于文件和目录操作、环境变量、进程管理等系统级功能。 - •
sys 模块用于命令行参数、标准流、解释器配置等运行时控制。 - • 两个模块配合使用,可以完成大部分系统管理和程序控制任务。
- • 注意跨平台兼容性,使用
os.path 处理路径。 - • 命令行工具开发离不开
sys.argv 和 sys.stdin/sys.stdout。
掌握 os 和 sys 模块,是编写跨平台系统工具、命令行应用的基础,也是深入理解 Python 运行环境的关键。