
本文共 2078 字,大约阅读时间需要 6 分钟。
IO编程是计算机科学中的一个核心概念,涉及输入和输出操作。输入输出(IO)是指数据在各种存储设备或网络中移动。由于程序和运行时数据驻留在内存中,而物理设备如磁盘或网络需要通过IO接口进行数据交换,理解IO编程对于编写高效程序至关重要。
1. Streams(流)
在IO编程中,Stream(流)是一种基础概念。可以将其想象为一条管道,数据通过单方向流动。Input Stream(输入流)接收从外围设备(如磁盘、网络)进入内存的数据,而Output Stream(输出流)将内存中的数据发送到外围设备。
例如,当浏览网页时,浏览器与服务器之间需要建立两条流:一条用于发送请求,另一条用于接收响应。
2. 同步IO与异步IO
IO操作有两种模式:同步IO和异步IO。
同步IO:CPU等待磁盘将数据写入内存后,再执行后续代码。这种模式阻塞程序,直到数据处理完成。其优点是简单易行,但可能导致效率低下。
异步IO:CPU通知磁盘数据将慢慢写入,暂时返回执行其他任务。这种模式允许程序在等待IO操作时流程并行。其优点是提高效率,但实现复杂,通常用于服务器端。
本文将重点介绍同步IO模式,因其适合绝大多数文件读写场景。
3. 文件读写
文件读写是IO编程的常见操作。Python内置了open()
函数,允许程序像操作系统一样处理文件。操作系统通过file descriptor(文件描述符)提供文件操作接口。
读取文件:使用
open()
函数和read()
方法读取文件内容。默认支持UTF-8编码,也可以指定其他编码方式。处理文件不存在异常:使用try-finally语句确保文件资源管理。
with
语句提供简洁代码,自动关闭文件。
4. StringIO和BytesIO
StringIO:内存中操作字符串流。适用于临时缓冲,如处理动态生成的文本数据。
from io import StringIOf = StringIO()f.write("hello ")f.write("world!")print(f.getvalue()) # 输出 "hello world!"
BytesIO:内存中操作二进制流,处理像图片、视频等二进制文件。
from io import BytesIOf = BytesIO()f.write(b'Hello')print(f.read()) # 输出 b'Hello'
5. 操作文件和目录
使用os
和os.path
模块进行文件和目录操作。os
模块提供系统信息和环境变量。
查看目录:获取当前目录绝对路径。
import osprint(os.path.abspath('.'))
创建删除目录:
mkdir()
和rmdir()
处理目录。os.rename()
重命名文件和目录。
6. 序列化
将内存数据保存或传输需要序列化和反序列化。Python的pickle
模块和JSON处理提供解决方案。
序列化:将Python对象转为字节流或字符串。
import pickled = dict(name='Bob', age=20, score=88)with open('dump.txt', 'wb') as f: pickle.dump(d, f)
反序列化:从文件读取数据并恢复对象。
with open('dump.txt', 'rb') as f: obj = pickle.load(f)print(obj) # 输出 {'age': 20, 'name': 'Bob', 'score': 88}
7. JSON处理
JSON格式广泛用于跨平台数据传输。json
模块将Python对象转为JSON字符串,反之亦行。
序列化为JSON
import jsonclass Student: def __init__(self, name, age, score): self.name = name self.age = age self.score = scores = Student('Bob', 20, 88)print(json.dumps(s, default=lambda x: x.__dict__)) # 输出 {"name": "Bob", "age": 20, "score": 88}
反序列化为Python对象
json_str = '{"name": "Bob", "age": 20, "score": 88}'print(json.loads(json_str, object_hook=lambda x: Student(**x))) # 输出 Student('Bob', 20, 88)
总结
由流到文件操作,再到序列化和反序列化,IO编程为数据交换奠定基础。正如Pluto的轨道理论所说,理解核心概念是理解复杂系统的关键。通过Python的内置工具,开发者可以高效地处理数据读写和操作,充分发挥内存速度优势。
发表评论
最新留言
关于作者
