1. IO编程
1.1 基本概念
程序在内存中运行,由CPU执行。数据流向内存的过程称为Input(输入),数据从内存流出的过程称为Output(输出)。
1.2 速度匹配问题
由于CPU和内存的执行速度远高于外设(如硬盘、网络),存在速度不匹配的问题,这导致了两种不同的IO处理方式:
同步IO:顺序执行,等待IO操作完成后再继续
异步IO:非阻塞执行,性能更高但编程模型复杂
- 回调模式:类似服务员主动通知汉堡已做好
- 轮询模式:类似短信通知,需要主动查询状态
2. 文件读写操作
文件操作基础
操作系统不允许普通程序直接操作磁盘,编程语言通过封装操作系统接口来实现文件访问。
文件打开与关闭
# 基本文件操作
f = open(file_name, mode) # 打开文件,返回文件对象
常用mode参数:
r:读取模式w:写入模式a:追加模式b:二进制模式t:文本模式
2.3 安全的文件操作
由于文件读写可能出现IOError,需要确保文件正确关闭:
传统方式(繁琐):
try:
f = open('test.txt', 'r')
# 文件操作
finally:
if f:
f.close()
推荐方式(使用with语句):
with open('test.txt', 'r') as f:
print(f.read()) # 自动执行close()
2.4 文件读取方法比较
| 方法 | 特点 | 适用场景 |
|---|---|---|
read() | 一次性读取所有内容 | 小文件 |
readline() | 一次读取一行 | 大文件逐行处理 |
readlines() | 读取所有行,返回列表 | 配置文件读取 |
read(size) | 读取指定长度数据 | 不确定文件大小 |
注意:read()方法会移动文件指针,第二次读取可能为空。
2.5 文件编码处理
# 读取非UTF-8编码文件
with open('file.txt', 'r', encoding='gbk') as f:
content = f.read()
# 读取二进制文件
with open('video.mp4', 'rb') as f:
data = f.read()
2.6 文件写入机制
文件写入时,操作系统采用缓冲区机制:
- 数据先写入内存缓冲区
- 缓冲区满、调用
close()或程序退出时,数据才写入磁盘 - 使用
with语句可避免数据丢失
with open('test.txt', 'w') as f:
f.write('hello world')
3. 内存读写操作
3.1 StringIO:内存字符串操作
from io import StringIO
f = StringIO('')
f.write('hello')
f.write(' ')
f.write('world')
print(f.getvalue()) # 输出:hello world
3.2 BytesIO:内存二进制数据操作
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue()) # 输出二进制数据
4. 文件与目录管理
Python的os模块提供了丰富的文件和目录操作功能:
4.1 环境变量操作
import os
# 获取系统环境变量
env_vars = os.environ
# 获取特定环境变量
path = os.environ.get('PATH')
4.2 注意事项
os模块的函数与操作系统相关(如Windows没有uname)- 文件目录操作函数分布在
os和os.path模块中
5. 最佳实践总结
- 始终使用with语句:确保文件正确关闭,避免资源泄漏
- 按需选择读取方法:根据文件大小选择合适的数据读取方式
- 正确处理编码:明确指定文件编码,避免乱码问题
- 利用内存操作:对于临时数据,使用StringIO/BytesIO提高效率
- 考虑跨平台兼容性:使用os模块时注意操作系统差异