在 Python 编程中,输入输出(I/O)是程序与外部世界交互的桥梁 在 Python 编程中输入输出I/O是程序与外部世界交互的桥梁。无论是简单的控制台交互还是复杂的文件处理、数据序列化掌握 I/O 技术都是构建高效、健壮应用程序的基础。本文将从基础到高级全面解析 Python 的输入输出技术并提供丰富的代码示例。一、标准输入输出控制台交互1. 标准输入input()函数input()函数用于从标准输入通常是键盘读取一行文本返回值永远是字符串类型。这是新手最容易踩坑的地方进行数值运算前必须进行显式类型转换。# 基础用法nameinput(请输入您的姓名: )print(f欢迎,{name}!)# 类型转换与异常处理try:ageint(input(请输入您的年龄: ))print(f明年您将{age1}岁)exceptValueError:print(输入无效请输入一个整数)# 一次输入多个值空格分隔datainput(请输入姓名和城市空格分隔: ).split()iflen(data)2:name,citydataprint(f姓名:{name}, 城市:{city})else:print(输入格式错误请重新尝试。)2. 标准输出print()函数print()函数将内容输出到标准输出通常是屏幕并支持丰富的格式化选项。# 自定义分隔符和结束符print(2024,10,01,sep-)# 输出: 2024-10-01print(进度10%,end → )print(进度50%,end → )print(进度100%)# 输出: 进度10% → 进度50% → 进度100%# 格式化输出推荐 f-stringpi3.1415926print(f圆周率约等于:{pi:.2f})# 输出: 圆周率约等于: 3.14# 输出到文件withopen(output.txt,w,encodingutf-8)asf:print(这是一条测试日志,filef)二、文件 I/O持久化存储文件操作是工作中最常用的 I/O 场景。核心是使用open()函数和with语句。1. 核心原则使用with语句自动管理文件的打开与关闭即使发生异常也能确保资源被释放避免内存泄漏。显式指定编码读写文本文件时务必指定encodingutf-8避免在不同操作系统如 Windows 的 GBK 与 Linux 的 UTF-8间出现乱码。2. 文件读写操作# 写入文件withopen(data.txt,w,encodingutf-8)asf:f.write(第一行内容\n)f.writelines([第二行内容\n,第三行内容\n])# 读取文件推荐逐行迭代内存友好withopen(data.txt,r,encodingutf-8)asf:forlineinf:print(line.strip())# strip() 去除行尾换行符3. 大文件处理优化对于几百 MB 甚至 GB 级别的大文件切忌使用read()或readlines()它们会将整个文件加载到内存极易导致内存溢出OOM。应采用分块读取或逐行迭代。# 分块读取大文件CHUNK_SIZE8192# 每次读取 8KBwithopen(large_file.txt,r,encodingutf-8)asf:whilechunk:f.read(CHUNK_SIZE):process(chunk)# 处理数据块4. 现代路径处理pathlibpathlib模块提供了面向对象的路径操作方式比传统的os.path更简洁。frompathlibimportPath file_pathPath(example.txt)# 写入file_path.write_text(Hello, pathlib!,encodingutf-8)# 读取contentfile_path.read_text(encodingutf-8)print(content)三、数据序列化JSON 与 Pickle当需要在程序间交换数据或持久化复杂对象时序列化技术必不可少。1. JSON 序列化JSON 是跨语言的数据交换标准Python 的json模块支持dict,list,str,int,float,bool,None等类型。importjson data{name:张三,age:25,skills:[Python,SQL]}# 序列化为字符串ensure_asciiFalse 确保中文正常显示json_strjson.dumps(data,ensure_asciiFalse,indent2)print(json_str)# 写入 JSON 文件withopen(data.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)# 从 JSON 文件读取并反序列化withopen(data.json,r,encodingutf-8)asf:loaded_datajson.load(f)print(loaded_data[name])2. Pickle 序列化pickle是 Python 专有的序列化协议可以序列化几乎任何 Python 对象如类实例、函数等但不具备跨语言兼容性且存在安全风险不要反序列化不可信的数据。importpickleclassUser:def__init__(self,name,age):self.namename self.ageage userUser(李四,30)# 序列化到文件withopen(user.pkl,wb)asf:pickle.dump(user,f)# 从文件反序列化withopen(user.pkl,rb)asf:loaded_userpickle.load(f)print(f{loaded_user.name},{loaded_user.age}岁)四、高级 I/O 特性1. 内存中的文件对象io模块提供了StringIO和BytesIO可以在内存中模拟文件操作常用于单元测试或临时数据处理避免磁盘 I/O 开销。fromioimportStringIO sioStringIO()sio.write(Hello, )sio.write(StringIO!)print(sio.getvalue())# 输出: Hello, StringIO!2. 缓冲机制与性能优化Python 的 I/O 默认启用缓冲通常 4KB/8KB。频繁的小量写入性能较差应批量写入或使用flush()强制刷新缓冲区如实时日志场景。withopen(log.txt,w,encodingutf-8)asf:foriinrange(100):f.write(fLog entry{i}\n)ifi%100:f.flush()# 每10条强制刷新确保日志实时写入3. 异步 I/Oasyncio在高并发网络编程中同步 I/O 会成为瓶颈。asyncio提供了异步 I/O 支持允许在等待 I/O 时执行其他任务。importasyncioasyncdeffetch_data():print(开始请求...)awaitasyncio.sleep(2)# 模拟网络延迟print(数据获取完成)returnDataasyncdefmain():resultawaitfetch_data()print(f结果:{result})asyncio.run(main())五、总结与最佳实践输入安全永远不要信任用户输入使用try-except处理ValueError等异常。资源管理文件操作一律使用with语句。编码规范文本文件读写显式指定encodingutf-8。大文件处理使用逐行迭代或分块读取避免readlines()。格式化输出优先使用 f-string简洁且性能高。序列化选择跨语言用 JSONPython 内部复杂对象用 Pickle注意安全。性能优化批量写入、合理使用缓冲、高并发场景考虑异步 I/O。掌握这些技术您将能够从容应对 Python 开发中的各种 I/O 需求构建出高效、稳定、用户友好的应用程序。