当前位置: 首页 > news >正文

【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 存储联系人,支持增删查改

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

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

http://www.cnnetsun.cn/news/14753.html

相关文章:

  • 3步搞定Snap.svg动画导出:从SVG到视频GIF的完整指南
  • Java ArrayList扩容机制深度解析
  • 手把手教你Windows系统安装pgvector:PostgreSQL向量搜索实战指南
  • xtb量子化学计算终极实战指南:从新手到专家的完整路径
  • Windows权限维持技术攻击手法与深度防御浅析
  • Windows系统映像劫持:网络安全中的“李代桃僵”战术
  • 几内亚硬建钢铁厂?中方点破 5 大短板!最致命问题中国一眼看穿!
  • Navicat重置工具完整指南:轻松解决试用期限制
  • 19、Linux 新软件安装全攻略
  • 使用STM32单片机进行串口通信的过程描述
  • JetBrains Maple Mono字体深度体验与配置指南
  • 【Java毕设源码分享】基于springboot+vue的个人博客系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • PaddleSpeech模型版本管理终极指南:从混乱到秩序
  • 闪电AI文档转换Lite:离线免费的全能文档处理神器
  • Windows系统pgvector一键部署攻略:告别编译烦恼,轻松开启向量搜索
  • 伊朗地毯数据集,波斯地毯Lechak-Toranj和Afshan图案分类,计算机视觉机器学习训练,纺织设计分析增强样本,装饰艺术特征提取对称检测算法,纹理分析Gabor滤波,个性化定制图案生成
  • [基础算法学习]backtrack回溯法(三):从N皇后、解数独带你掌握棋盘回溯问题
  • 终极指南:如何从零开始掌握Lean数学库mathlib?完整教程助你快速入门
  • Go之路 - 7.go的函数
  • Chet.QuartzNet.UI 基于VbenAdmin框架的现代化UI体验
  • AI 在泛前端领域的思考和实践-上篇
  • 靠谱的厦门考研哪个好选哪个
  • 高通万卫星:混合AI与分布式协同是未来 | MEET2026
  • AI图像编辑大师:InstructPix2Pix模型完全使用手册
  • 终极GASShooter游戏开发完整指南:快速构建高性能射击游戏
  • 零基础掌握Docker容器:5分钟快速上手实战指南
  • CppSharp完全指南:5步实现C++到.NET的自动化绑定
  • 解密 plum:三分钟打造你的专属 Rime 输入法生态
  • 边缘计算中的Agent资源调度难题:如何实现毫秒级响应与负载均衡?
  • 迭代器的初认识