目录
- 专栏列表
- 引言
- 基础概念
- 什么是IO?
- 同步IO vs 异步IO
- 同步IO(Synchronous IO)
- 异步IO(Asynchronous IO)
- Python中的IO
- 标准IO
- 标准输入和输出
- 文件IO
- 文件操作的上下文管理器
- 打开文件
- 读取文件
- 操作内存中的数据
- 高级文件操作
- 读写二进制文件
- 使用文件指针
- 网络IO
- 使用`requests`库
- 使用`socket`库
- 异常处理
- 总结
- 参考文献
专栏列表
- Python教程(十):面向对象编程(OOP)
- Python教程(十一):单元测试与异常捕获
- Python教程(十二):面向对象高级编程详解
- Python教程(十三):常用内置模块详解
- Python教程(十四):Requests模块详解
正文开始
,如果觉得文章对您有帮助,请帮我三连+订阅,谢谢
💖💖💖
引言
IO在计算机中指Input/Output,也就是输入和输出。输入输出(IO)是计算机程序与外部世界交互的基本方式。在Python中,IO编程涉及到文件读写、网络通信等操作。
基础概念
什么是IO?
IO是Input/Output
的缩写,即输入和输出。在编程中,IO操作包括从用户那里获取输入(如键盘输入)和向用户发送输出(如屏幕显示或文件写入)。
同步IO vs 异步IO
同步IO(Synchronous IO)和异步IO(Asynchronous IO)是两种不同的IO操作模式同步IO简单但效率可能较低,特别是在IO密集型的应用中。异步IO可以提高效率和并发性,但编程模型更复杂。
同步IO(Synchronous IO)
在同步IO中,当一个IO操作(如读取文件、网络请求)发起时,发起请求的线程会被阻塞,直到IO操作完成。这意味着在等待IO操作完成的过程中,线程不能执行其他任务。
特点:
- 简单直观,容易理解和实现。
- 线程在IO操作完成前被阻塞,不能做其他事情。
异步IO(Asynchronous IO)
异步IO允许程序在发起IO请求后立即去做其他事情,而不需要等待IO操作完成。当IO操作完成时,操作系统会通知程序,或者通过回调函数、事件、或未来(promises)等方式来处理结果。
程序发起IO请求后,不是等待IO操作完成,而是继续执行其他任务。当操作系统通知IO操作完成时,程序再处理IO结果。
特点:
- 非阻塞,提高程序的并发性能。
- 编程模型相对复杂,需要处理回调、事件循环等。
Python中的IO
Python提供了多种IO操作的方式,包括:
- 标准IO:使用
input()
函数从标准输入读取数据,使用print()
函数向标准输出发送数据。 - 文件IO:使用内置的
open()
函数来打开文件,并进行读写操作。 - 网络IO:通过第三方库如
requests
进行网络请求,或使用内置库如socket
进行底层网络通信。
标准IO
标准输入和输出
在Python中,可以通过input()
函数读取用户输入的字符串,并通过print()
函数输出信息到控制台。
python"># 标准输入示例
user_input = inpution">("请输入你的名字:"ion">)
printion">("你好," + user_input + "!"ion">)
文件IO
文件操作的上下文管理器
with
语句提供了一种优雅的方式来处理文件操作,它可以自动关闭文件,即使发生异常也是如此。不用我们每次都像下面这样写, 需要手动去捕获异常,然后关闭文件
tryion">:f = openion">('example.txt'ion">, 'r'ion">) printion">(fion">.readion">(ion">)ion">)
finallyion">:if fion">:fion">.closeion">(ion">)
打开文件
使用open()
函数可以打开一个文件,并指定操作模式,如'r'
(只读)、'w'
(只写)、'a'
(追加)等。
python"># 打开文件示例
with openion">('example.txt'ion">, 'w'ion">) as fileion">:fileion">.writeion">("Hello, IO!"ion">)
读取文件
使用open()
函数打开文件后,可以读取文件内容。
python"># 读取文件示例
with openion">('example.txt'ion">, 'r'ion">) as fileion">:content = fileion">.readion">(ion">) printion">(contention">)
调用readlines()
一次读取所有内容并按行返回list
for line in fion">.readlinesion">(ion">)ion">:printion">(lineion">.stripion">(ion">)ion">) # 把末尾的'\n'删掉
操作内存中的数据
很多时候,数据读写不一定是文件,也可以在内存中读写 , StringIO顾名思义就是在
内存中读写str
,StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO
。
from io import StringIOion">,BytesIOs = StringIOion">(ion">)
sion">.writeion">('Hello'ion">)
sion">.writeion">(' -- 'ion">)
sion">.writeion">('World'ion">)
printion">(ion">f'获取内存s的值:ion">ion">{sion">.getvalueion">(ion">)ion">}'ion">)# BytesIO
f = BytesIOion">(ion">)
fion">.writeion">('中文'ion">.encodeion">('utf-8'ion">)ion">)
printion">(ion">f'获取内存f的值:ion">ion">{fion">.getvalueion">(ion">)ion">}'ion">)
高级文件操作
读写二进制文件
除了文本文件,Python也可以读写二进制文件。
python"># 写入二进制文件示例
with openion">('image.png'ion">, 'wb'ion">) as fileion">:fileion">.writeion">(b'\x89PNG\r\n\x1a\n'ion">)# 读取二进制文件示例
with openion">('image.png'ion">, 'rb'ion">) as fileion">:data = fileion">.readion">(ion">)
使用文件指针
可以控制文件指针的位置,实现文件的随机访问。
python">with openion">('example.txt'ion">, 'r+'ion">) as fileion">:fileion">.seekion">(0ion">, 2ion">) # 移动到文件末尾fileion">.writeion">(" New content"ion">)
网络IO
使用requests
库
- 可以参考前文:Python教程(十四):Requests模块详解
requests
是一个简单易用的HTTP库,可以用来发送网络请求。
python">import requestsresponse = requestsion">.getion">('https://baidu.com'ion">)
printion">(responseion">.textion">)
使用socket
库
socket
是Python的底层网络通信库,可以用来实现TCP/IP通信。
python">import socket# 创建socket对象
s = socketion">.socketion">(socketion">.AF_INETion">, socketion">.SOCK_STREAMion">)
sion">.connection">(ion">('www.example.com'ion">, 80ion">)ion">)
sion">.sendion">(b'GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n'ion">)
response = sion">.recvion">(1024ion">)
sion">.closeion">(ion">)
printion">(responseion">.decodeion">(ion">)ion">)
异常处理
在进行IO操作时,可能会遇到各种异常,如文件不存在、网络连接错误等。使用try...except
语句可以捕获并处理这些异常。
python">tryion">:with openion">('nonexistent.txt'ion">, 'r'ion">) as fileion">:fileion">.readion">(ion">)
except FileNotFoundErrorion">:printion">("文件不存在"ion">)
总结
IO编程是Python编程中的一个重要组成部分。从简单的标准IO到复杂的文件和网络IO,Python提供了丰富的功能和库来支持各种IO操作。掌握这些技能,可以帮助你构建更加强大和灵活的应用程序。
参考文献
- Python官方文档关于IO的部分。
requests
官方文档。socket
编程的详细教程。