公司动态
零基础学 Python 第12章 | 文件读写:让数据持久保存
本章摘要核心目标掌握文件读取与写入让程序的数据能保存到磁盘并重新加载核心知识点open()函数、r/w/a三种模式、read/readline/readlines、write/writelines、with上下文管理器、文件路径实操产出日记本程序支持写入日记、读取历史记录前置基础第9-11章函数基础与进阶、第8章字符串操作、第3章异常处理概念一、写在前面前面写的程序有一个共同的问题程序一关数据全没了。变量、字典、列表里的数据都存在内存中程序结束就消失。想让数据活下来就需要把它写到文件里。文件存在硬盘上关机也不会丢。这一章学习 Python 怎么读写文件——从最基础的open()到推荐的with写法一步步来。二、打开文件open()open()是 Python 内置函数用来打开文件返回一个文件对象fopen(test.txt,r)# 以只读模式打开contentf.read()# 读取内容print(content)f.close()# 关闭文件重要2.1 文件打开模式模式含义文件不存在时特点r只读默认报错只能读取不能修改w只写自动创建覆盖原有内容a追加自动创建在末尾添加不覆盖r读写报错可读可写最重要的区别w会清空原文件再写入a不会。新手用w时要特别小心别把重要文件覆盖了。三、读取文件3.1read()一次读完fopen(test.txt,r)contentf.read()# 一次性读取全部内容print(content)f.close()文件很大时不要用read()会占用大量内存。3.2readline()一次读一行fopen(test.txt,r)line1f.readline()# 读第一行line2f.readline()# 读第二行print(line1,end)# readline 末尾自带换行符print 的 end 避免多空一行print(line2,end)f.close()3.3readlines()读所有行存列表fopen(test.txt,r)linesf.readlines()# 每一行作为列表的一个元素print(lines)# [第一行\n, 第二行\n, 第三行]f.close()3.4 最推荐for循环逐行读取fopen(test.txt,r)forlineinf:# 直接遍历文件对象一行一行读print(line,end)# 内存友好适合大文件f.close()四种读取方式的区别read()一次全读、readline()一次一行、readlines()全读存列表、for line in f逐行遍历。日常用for最多。四、写入文件4.1write()写入字符串fopen(diary.txt,w)# w 模式覆盖写入f.write(2026年7月8日\n)f.write(今天学习了文件读写。\n)f.close()4.2writelines()写入多行lines[第一行\n,第二行\n,第三行\n]fopen(notes.txt,w)f.writelines(lines)# 注意writelines 不会自动加换行符f.close()4.3 追加写入fopen(diary.txt,a)# a 模式追加写入f.write(追加一段新内容。\n)f.close()write()和writelines()都不会自动加换行符需要手动在字符串末尾加\n。五、with语句自动关闭文件每次open()后都要记得close()忘了关闭可能导致文件损坏或内存泄漏。Python 提供了with语句自动帮你关闭# 传统写法需要手动 closefopen(test.txt,r)contentf.read()f.close()# with 写法自动关闭推荐withopen(test.txt,r)asf:contentf.read()# 离开 with 块后文件自动关闭不用写 close()print(content)with的优势代码块结束自动关闭文件不用记close()即使代码出错如异常文件也会被正确关闭代码更简洁缩进清晰以后写文件读写一律用with忘掉手动close。六、文件路径6.1 相对路径与绝对路径# 相对路径相对于当前运行目录withopen(data.txt,r)asf:contentf.read()# 绝对路径完整路径# Windowswithopen(C:\\Users\\test\\data.txt,r)asf:contentf.read()# Mac / Linuxwithopen(/home/user/data.txt,r)asf:contentf.read()Windows 路径用反斜杠\但 Python 中\是转义字符所以要写\\双反斜杠或者在字符串前加rrC:\Users\test\data.txt。6.2 推荐os.path处理路径importos# 拼接路径自动适配操作系统file_pathos.path.join(data,scores.txt)# Windows: data\scores.txt# Mac/Linux: data/scores.txt# 检查文件是否存在ifos.path.exists(file_path):print(文件存在)else:print(文件不存在)七、Scratch 积木对照本章无 Scratch 对照。Scratch 不涉及文件系统操作程序数据存在浏览器内存中关闭即丢失。Python 的文件读写是真正的持久化能力这是从玩具程序到实用工具的分水岭。八、综合实战日记本程序综合运用文件读写、with语句、input交互、字符串格式化、函数封装# # 日记本程序# importos DIARY_FILEmy_diary.txtdefwrite_diary():写日记dateinput(请输入日期如 2026-07-08)weatherinput(请输入天气)contentinput(请输入日记内容\n)withopen(DIARY_FILE,a,encodingutf-8)asf:f.write(f{*30}\n)f.write(f日期{date}\n)f.write(f天气{weather}\n)f.write(f内容{content}\n)f.write(f{*30}\n\n)print(f✅ 日记已保存到{DIARY_FILE})defread_diary():读日记ifnotos.path.exists(DIARY_FILE):print( 还没有日记记录先写一篇吧)returnprint(f\n{*30})print( 我的日记本)print(f{*30})withopen(DIARY_FILE,r,encodingutf-8)asf:forlineinf:print(line,end)print(f\n{*30})defsearch_diary():搜索日记ifnotos.path.exists(DIARY_FILE):print( 还没有日记记录)returnkeywordinput(请输入搜索关键词)foundFalsewithopen(DIARY_FILE,r,encodingutf-8)asf:contentf.read()# 按分隔符拆分每篇日记entriescontent.split(*30)forentryinentries:ifkeywordinentry:print(*30)print(entry.strip())foundTrueifnotfound:print(f未找到包含「{keyword}」的日记)# 主程序print(*30)print( 日记本 v1.0)print(*30)whileTrue:print()print(1. 写日记)print(2. 查看所有日记)print(3. 搜索日记)print(4. 退出)print(-*25)choiceinput(请选择1-4)ifchoice1:write_diary()elifchoice2:read_diary()elifchoice3:search_diary()elifchoice4:print(再见日记已保存在文件中。)breakelse:print(⚠️ 无效选择)运行效果 日记本 v1.0 1. 写日记 2. 查看所有日记 3. 搜索日记 4. 退出 ------------------------- 请选择1-41 请输入日期如 2026-07-082026-07-08 请输入天气晴 请输入日记内容 今天学会了Python文件读写很开心 ✅ 日记已保存到 my_diary.txt分步拆解函数封装写日记、读日记、搜索日记分别封装成函数结构清晰追加模式写日记用a模式每次新增不会覆盖之前的日记with语句所有文件操作用with自动关闭不用操心encodingutf-8明确指定编码避免中文乱码os.path.exists读文件前先检查是否存在避免FileNotFoundError搜索功能用字符串split()按分隔符拆分每篇日记再用in匹配关键词九、常见报错速查表报错信息出现场景原因解决方法FileNotFoundError: [Errno 2]open()文件路径不对或文件不存在r模式检查路径确认文件存在或用w/a模式自动创建UnicodeDecodeErrorread()文件编码与读取编码不一致常见中文乱码open()时加encodingutf-8PermissionErroropen()文件被其他程序占用或没有写入权限关闭占用该文件的程序检查权限io.UnsupportedOperation: not writablewrite()用 “r” 模式打开却尝试写入改用 “w” 或 “a” 模式打开ValueError: I/O operation on closed fileread/write文件已close后还尝试操作把操作放在with块内或不要提前close十、本章小结本章你掌握了 Python 文件读写的完整流程打开模式——r只读、w覆盖写、a追加写文件不存在时行为不同读取方式——read()全读、readline()读一行、readlines()读成列表、for line in f逐行遍历写入操作——write()写字符串、writelines()写多行都不自动加换行符with语句——自动关闭文件即使出错也不漏关以后一律用with文件路径——相对路径/绝对路径用os.path处理跨平台路径文件读写让程序的数据能持久保存这是从玩具程序到实用工具的关键一步。往期回顾《Python 零基础入门从积木到代码》专栏序零基础学 Python 第1章 | 全平台装环境 VS Code 配置 第一个 Hello World零基础学 Python 第2章 | print 输出 变量赋值 input 交互输入零基础学 Python 第3章 | 条件判断if / elif / else零基础学 Python 第 4 章 | for 循环与 range()让程序帮你重复干活零基础学 Python 第 5 章 | while 循环与循环嵌套让程序看着条件自己干活零基础学 Python 第 6 章 | 元组与集合不可变数据与自动去重零基础学 Python 第7章 | 字典 dict键值对存储零基础学 Python 第8章 | 字符串操作与格式化输出零基础学 Python 第9章 | 函数基础def、参数与返回值零基础学 Python 第10章 | 函数进阶参数灵活用法与作用域零基础学 Python 第11章 | 匿名函数与高阶函数下一章预告文件读写时会遇到各种意外——文件不存在、编码错误、权限不足。下一章学习try-except异常处理让程序遇到错误不崩溃而是优雅地处理。文末资源区资源说明Python 官方文档 - 文件读写https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-filesPython 官方文档 -open()https://docs.python.org/3/library/functions.html#openPython 官方文档 -os.pathhttps://docs.python.org/3/library/os.path.html本章完整源码chapter12_all.py关注梅雅达编程笔记评论领资料每节课都配套课后练习题与完整源码。代码报错、看不懂知识点可在评论区粘贴问题逐一解答欢迎关注梅雅达编程笔记持续分享Python零基础学习内容