【Python实战进阶】6、Python输入输出全攻略:从基础交互到文件/JSON序列化实战

# Python输入输出全攻略:从基础交互到文件/JSON序列化实战(含mermaid图解)

前言

Python程序的核心逻辑离不开“输入→处理→输出”的“黑箱模型”——输入是程序的“养料”,输出是程序的“成果”。
不管是新手入门的键盘交互,还是工作中的文件处理、数据序列化,掌握输入输出(I/O)都是Python开发的必备技能。
本文从基础到高级,结合图解和实战代码,覆盖Python I/O的核心场景(基础交互、文件操作、JSON序列化、高级优化),帮你一站式搞定所有I/O需求,避开常见陷阱!

一、Python I/O核心逻辑:黑箱模型图解

Python的输入输出本质是“数据流动的通道”,所有I/O操作都围绕“数据从外部进入程序,或从程序输出到外部”展开,用流程图可直观展示:
在这里插入图片描述

核心说明:外部数据源(键盘、文件等)通过输入通道将数据传入程序,经内部处理后,通过输出通道写入外部载体(控制台、文件等),这就是Python I/O的底层逻辑。

二、基础输入输出:搞定用户交互

1. 输入:input()函数的用法与避坑

input()是Python获取键盘输入的核心函数,默认返回字符串类型,这是新手最容易踩坑的点!

关键代码(含类型转换)
# 基础用法:获取字符串输入
name = input("请输入姓名:")
print(f"你好,{name}!")  # 输出:你好,张三!

# 避坑:数字输入必须显式转换
age = input("请输入年龄:")
print(type(age))  # <class 'str'>(即使输入数字,也是字符串)
age = int(input("请输入年龄:"))  # 转为整数
print(f"3年后你{age+3}岁")  # 正常运算:3年后你25岁

# 进阶:一次输入多个值
data = input("请输入姓名和城市(空格分隔):").split()
name, city = data[0], data[1]
print(f"姓名:{name},城市:{city}")
常见陷阱
  • ❌ 直接对input()结果做算术运算(需用int()/float()转换);
  • ❌ 输入含空格时未处理(用split()拆分或strip()去空格)。

2. 输出:print()的实用技巧

print()不止是“打印”,还支持格式化、自定义分隔符/结束符等高级用法:

# 技巧1:一次打印多个值(默认空格分隔)
name = "李四"
score = 92.5
print("姓名:", name, "成绩:", score)

# 技巧2:自定义分隔符和结束符
print("2024", "10", "01", sep="-")  # 输出:2024-10-01
print("进度10%", end="→")
print("进度50%", end="→")
print("进度100%")  # 输出:进度10%→进度50%→进度100%

# 技巧3:格式化输出(推荐f-string)
print(f"姓名:{name},成绩:{score:.1f}分")  # 格式化数字:92.5分
print("姓名:{},成绩:{:.2f}分".format(name, score))  # 兼容旧版本

三、文件I/O:从读写到大文件优化

文件操作是工作中最常用的I/O场景,核心是open()函数和with语句(自动关闭文件,避免资源泄露)。

1. 文件操作核心流程(mermaid图解)

在这里插入图片描述

2. 关键代码(文件读写)

(1)基础文件操作(with语句必用)
# 读取文件(小文件)
with open("in.txt", "r", encoding="utf-8") as fin:
    content = fin.read()  # 读取全部内容
    print("文件内容:", content)

# 写入文件(覆盖/追加)
with open("out.txt", "w", encoding="utf-8") as fout:  # "w"覆盖,"a"追加
    fout.write("姓名,年龄,城市\n")
    fout.write("张三,22,北京\n")

# 逐行读取(大文件推荐,内存友好)
with open("large.txt", "r", encoding="utf-8") as fin:
    for line in fin:
        print("行内容:", line.strip())  # strip()去除换行符
(2)大文件处理优化(分块读取)
# 分块读取大文件(避免内存溢出)
CHUNK_SIZE = 8192  # 每次读取8KB
with open("huge.log", "rb") as fin:  # 二进制模式更快
    while chunk := fin.read(CHUNK_SIZE):
        process(chunk)  # 自定义处理逻辑(如解析日志)
(3)open()模式汇总(关键)
模式功能文本/二进制
r只读(默认)文本
w覆盖写入文本
a追加写入文本
r+读写文本
rb二进制只读二进制
wb二进制写入二进制

3. 避坑点

  • ✅ 读写中文文件必须加encoding="utf-8"(Windows需注意GBK编码场景);
  • ✅ 优先用with语句,避免忘记close()导致文件句柄泄漏;
  • ✅ 大文件用逐行/分块读取,切勿直接read()加载全部内容。

四、JSON序列化:跨语言数据交换

JSON是轻量级数据交换格式,Python通过json模块实现对象与JSON字符串的转换,适用于数据存储和网络传输。

1. JSON序列化流程(mermaid图解)

在这里插入图片描述

2. 关键代码

(1)基础序列化/反序列化
import json

# Python对象 → JSON字符串
params = {
    "name": "张三",
    "age": 25,
    "scores": [95, 88],
    "is_student": True
}
json_str = json.dumps(params, ensure_ascii=False, indent=2)  # ensure_ascii=False显示中文
print("JSON字符串:", json_str)

# JSON字符串 → Python对象
original_params = json.loads(json_str)
print("反序列化后:", original_params["name"])  # 输出:张三

# Python对象 → JSON文件
with open("data.json", "w", encoding="utf-8") as fout:
    json.dump(params, fout, ensure_ascii=False, indent=2)

# JSON文件 → Python对象
with open("data.json", "r", encoding="utf-8") as fin:
    loaded_params = json.load(fin)
print("从文件读取:", loaded_params["scores"])  # 输出:[95, 88]
(2)核心注意事项
  • ensure_ascii=False:避免中文被编码为Unicode转义符;
  • indent=2:格式化JSON字符串,便于阅读;
  • 支持的Python类型:dictliststrintfloatboolNone

五、高级I/O技巧:性能优化与安全

1. 缓冲机制(提升I/O性能)

文件操作默认启用缓冲(4KB/8KB),批量写入比频繁小写入快3-5倍,关键代码:

import time

# 低效:频繁小写入
start = time.time()
with open("slow.txt", "w") as f:
    for i in range(100000):
        f.write(f"Line {i}\n")
print(f"频繁写入耗时:{time.time()-start:.2f}s")

# 高效:累积后批量写入
start = time.time()
lines = [f"Line {i}\n" for i in range(100000)]
with open("fast.txt", "w") as f:
    f.write("".join(lines))
print(f"批量写入耗时:{time.time()-start:.2f}s")

2. pathlib:现代路径处理(替代os.path)

from pathlib import Path

# 创建路径对象(跨平台兼容)
file_path = Path("data/subdir/test.txt")
file_path.parent.mkdir(parents=True, exist_ok=True)  # 递归创建目录

# 写入/读取文件
file_path.write_text("Hello Pathlib", encoding="utf-8")
content = file_path.read_text(encoding="utf-8")
print("Pathlib读取:", content)

# glob匹配文件
py_files = list(Path("src").glob("**/*.py"))  # 递归查找所有.py文件
print("找到的Python文件:", py_files)

3. 上下文管理器原理

with语句的底层是实现了__enter____exit__方法的上下文协议,自定义示例:

class ManagedFile:
    def __enter__(self):
        self.file = open("test.txt", "w")
        return self.file  # as关键字接收的值
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()  # 自动关闭文件

# 使用自定义上下文管理器
with ManagedFile() as f:
    f.write("自定义上下文管理器")

六、实战案例:学生成绩统计系统

整合前面的I/O知识,实现“输入成绩→计算平均分→保存结果到文件”的完整流程:

import datetime

def score_statistics():
    # 1. 输入:获取3个学生成绩(含输入验证)
    scores = []
    for i in range(3):
        while True:
            try:
                score = float(input(f"请输入第{i+1}个学生的成绩:"))
                scores.append(score)
                break
            except ValueError:
                print("输入错误,请输入数字!")
    
    # 2. 处理:计算平均分
    average = sum(scores) / len(scores)
    result = f"学生成绩:{scores}\n平均分:{average:.2f}分"
    
    # 3. 输出:打印+保存到文件
    print("="*20)
    print(result)
    with open("score_stat.txt", "w", encoding="utf-8") as f:
        f.write(f"统计时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}\n")
        f.write(result)

if __name__ == "__main__":
    score_statistics()

七、Python I/O最佳实践总结

  1. 优先用with语句:自动管理文件/资源,避免泄漏;
  2. 显式指定编码:读写文本文件必加encoding="utf-8"
  3. 按需选择I/O方式:小文件一次性读取,大文件逐行/分块处理;
  4. 序列化选JSON:跨语言兼容,pickle仅限Python内部使用;
  5. 输入必做验证:用try-except处理类型转换错误。

结尾

Python的输入输出看似基础,却贯穿开发全流程。
掌握本文的基础用法、高级技巧和实战案例,能帮你高效处理键盘交互、文件操作、数据序列化等场景。
如果遇到I/O性能瓶颈或编码问题,欢迎在评论区交流!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心水

您的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值