news 2026/5/27 13:40:26

【Python】基础语法入门(十七)——文件操作与数据持久化:安全读写本地数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python】基础语法入门(十七)——文件操作与数据持久化:安全读写本地数据


💾说明:几乎所有程序都需要与文件打交道——保存配置、记录日志、处理用户数据。本篇系统讲解 Python文件操作的核心方法,涵盖文本/二进制读写、路径处理、异常安全、编码问题及常用数据格式(CSV、JSON),助你写出可靠、跨平台、无乱码的文件处理代码。

你将掌握:

  • open()的正确用法与编码陷阱
  • 为什么必须用with语句?
  • 读写 CSV 和 JSON 文件
  • 处理大文件的高效策略
  • 路径拼接的最佳实践(pathlib

1. 基础文件读写:open()with

✅ 推荐写法:使用上下文管理器

# 写入文件withopen("hello.txt","w",encoding="utf-8")asf:f.write("你好,世界!")# 读取文件withopen("hello.txt","r",encoding="utf-8")asf:content=f.read()print(content)# 你好,世界!

🔑关键点

  • 必须指定encoding="utf-8"(避免 Windows 默认gbk导致乱码)
  • 永远用with:自动关闭文件,即使出错也安全

2. 文件打开模式速查表

模式含义说明
'r'只读(默认)文件必须存在
'w'写入覆盖原文件,不存在则创建
'a'追加在文件末尾添加,不覆盖
'x'独占创建文件存在则失败(防覆盖)
'b'二进制模式'rb','wb'
'+'读写'r+'(可读可写,不创建)

示例:追加日志

withopen("app.log","a",encoding="utf-8")asf:f.write("[INFO] 程序启动\n")

3. 读取文件的不同方式

方法适用场景
f.read()一次性读取全部内容(小文件)
f.readline()逐行读取(节省内存)
f.readlines()读取所有行到列表(需随机访问行)
for line in f推荐!高效逐行迭代(大文件)

处理大文件(推荐方式)

# 安全处理 GB 级日志文件withopen("huge.log","r",encoding="utf-8")asf:forlineinf:# 一次只加载一行到内存if"ERROR"inline:print(line.strip())

优势:内存占用恒定,不随文件大小增长。


4. 路径处理:告别字符串拼接!

❌ 错误做法(不可移植)

# Windows 用 \,Linux/Mac 用 /,极易出错!filepath="data"+"\\"+"input.txt"

✅ 正确做法:使用pathlib(Python 3.4+)

frompathlibimportPath data_dir=Path("data")file_path=data_dir/"input.txt"# 自动适配操作系统# 检查并创建目录data_dir.mkdir(exist_ok=True)# 读取文件content=file_path.read_text(encoding="utf-8")

💡pathlib是现代 Python 文件路径操作的标准方式


5. 数据持久化:JSON 与 CSV

5.1 JSON:结构化数据交换

importjsonfrompathlibimportPath# 写入data={"users":["Alice","Bob"],"version":1.0}Path("config.json").write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding="utf-8")# 读取loaded=json.loads(Path("config.json").read_text(encoding="utf-8"))print(loaded["users"])# ['Alice', 'Bob']

⚠️ 注意:json只支持基本类型(dict,list,str,int,float,bool,None


5.2 CSV:表格数据处理

importcsvfrompathlibimportPath# 写入 CSVwithopen("students.csv","w",newline="",encoding="utf-8")asf:writer=csv.writer(f)writer.writerow(["姓名","年龄","班级"])writer.writerow(["小明",18,"高三(1)班"])# 读取 CSV(推荐 DictReader)withopen("students.csv",encoding="utf-8")asf:reader=csv.DictReader(f)forrowinreader:print(f"{row['姓名']}-{row['班级']}")# 小明 - 高三(1)班

🔑关键参数

  • newline="":防止 Windows 多余空行
  • DictReader:按列名访问,比索引更清晰

6. 二进制文件操作:图片、音频等

# 复制图片withopen("photo.jpg","rb")assrc:withopen("photo_copy.jpg","wb")asdst:dst.write(src.read())# 或用 shutil(更高效)importshutil shutil.copy2("photo.jpg","backup/photo_copy.jpg")

✅ 二进制模式('rb','wb'不需要指定 encoding


7. 异常处理:让文件操作更健壮

frompathlibimportPathdefsafe_read_file(filepath):path=Path(filepath)try:ifnotpath.exists():raiseFileNotFoundError(f"文件不存在:{filepath}")returnpath.read_text(encoding="utf-8")exceptPermissionError:print("❌ 权限不足,无法读取文件")exceptUnicodeDecodeError:print("❌ 文件编码不是 UTF-8,请检查")exceptExceptionase:print(f"❌ 未知错误:{e}")returnNonecontent=safe_read_file("secret.txt")

🛡️常见异常

  • FileNotFoundError
  • PermissionError
  • IsADirectoryError
  • UnicodeDecodeError(编码错误)

8. 实用技巧与最佳实践

场景推荐方案
临时文件tempfile.NamedTemporaryFile()
文件备份shutil.copy2(src, dst)(保留元数据)
递归遍历目录Path.rglob("*.txt")
获取文件大小Path("file.txt").stat().st_size
安全写入(防中断损坏)先写临时文件,再重命名

安全写入示例(原子操作)

frompathlibimportPathimportosdefatomic_write(filepath,content):"""安全写入:避免程序崩溃导致文件损坏"""temp_path=Path(filepath).with_suffix(".tmp")try:temp_path.write_text(content,encoding="utf-8")os.replace(temp_path,filepath)# 原子替换exceptException:temp_path.unlink(missing_ok=True)# 清理临时文件raise

9. 总结:文件操作黄金法则

  1. 永远用with open(...)
  2. 显式指定encoding="utf-8"(文本文件)
  3. pathlib.Path处理路径
  4. 大文件用for line in file逐行读取
  5. 结构化数据优先选 JSON/CSV
  6. 捕获并处理常见文件异常

💾记住
“文件是程序与外部世界的桥梁,
安全、可靠、跨平台是你的责任。”


下一步练习

  1. 改造你的 To-Do List 项目
    • 用 JSON 保存任务列表
    • 实现“自动备份”功能(每天生成todo_backup_20251212.json
  2. 编写一个日志分析脚本
    • 读取app.log
    • 统计 ERROR 行数并输出到error_report.txt
  3. 尝试用 CSV 存储联系人,支持增删查改

🐍掌控文件,就是掌控数据。
你已具备构建完整本地应用的能力!

继续编码,让数据为你所用!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 15:43:00

5个实用技巧:轻松掌握JSON对比工具的高效使用方法

5个实用技巧:轻松掌握JSON对比工具的高效使用方法 【免费下载链接】online-json-diff 项目地址: https://gitcode.com/gh_mirrors/on/online-json-diff JSON对比工具是现代开发中不可或缺的利器,能够快速识别数据结构的差异,帮助开发…

作者头像 李华
网站建设 2026/5/28 1:06:57

节点NotReady后容器驱逐时间调整

一、简介 早期k8s版本中,Kubernetes Controller Manager 有一些相关参数,用于控制节点监控和 Pod 驱逐的行为。 --node-monitor-grace-period40s(节点失联后等待多久才标记为不健康) --node-monitor-period30s(Contr…

作者头像 李华
网站建设 2026/5/26 4:22:54

深入浅出窗口看门狗(WWDG):从原理到实战,守护MCU系统稳定运行

在嵌入式系统开发中,“稳定性”是贯穿始终的核心诉求。无论是工业控制中的PLC、汽车电子中的ECU,还是智能家居中的传感器节点,一旦程序出现“跑飞”“死循环”等异常,都可能引发设备故障、数据丢失甚至安全事故。为应对这类问题&a…

作者头像 李华
网站建设 2026/5/26 4:22:52

Qwen2-VL微调终极指南:3步快速上手视觉语言模型训练

Qwen2-VL微调终极指南:3步快速上手视觉语言模型训练 【免费下载链接】Qwen2-VL-Finetune An open-source implementaion for fine-tuning Qwen2-VL and Qwen2.5-VL series by Alibaba Cloud. 项目地址: https://gitcode.com/gh_mirrors/qw/Qwen2-VL-Finetune …

作者头像 李华
网站建设 2026/5/27 10:53:48

XAPK转换实战指南:轻松解决安卓应用安装困扰

XAPK转换实战指南:轻松解决安卓应用安装困扰 【免费下载链接】xapk-to-apk A simple standalone python script that converts .xapk file into a normal universal .apk file 项目地址: https://gitcode.com/gh_mirrors/xa/xapk-to-apk 你是否遇到过下载的安…

作者头像 李华
网站建设 2026/5/27 16:40:27

终极阿尔比恩OL数据分析工具完整指南:快速掌握游戏数据奥秘

终极阿尔比恩OL数据分析工具完整指南:快速掌握游戏数据奥秘 【免费下载链接】AlbionOnline-StatisticsAnalysis A tool with many features for the game Albion Online 项目地址: https://gitcode.com/gh_mirrors/al/AlbionOnline-StatisticsAnalysis 在《阿…

作者头像 李华