Day 12:【99天精通Python】文件操作 - 让数据持久化保存

Day 12:【99天精通Python】文件操作 - 让数据持久化保存

前言

欢迎来到第12天!

在前面的11天里,我们写的所有程序,数据都保存在内存中。一旦程序运行结束或者电脑关机,那些辛苦计算出来的结果、用户输入的信息瞬间就消失了。

为了让数据能够长久保存(持久化),我们需要把数据写入到磁盘上的文件中。今天,我们将学习Python中的**文件I/O(输入/输出)**操作。学会了这一招,你就能做很多实用的事情了,比如写日志、处理Excel数据(CSV)、读取配置文件等。

本节内容:

  • 文件的打开与关闭
  • 最佳实践:with语句
  • 读取文件内容(全量读、按行读)
  • 写入文件内容(覆盖写、追加写)
  • 文件操作模式汇总
  • 实战练习

一、文件的基本操作流程

操作文件就像把大象装进冰箱,总共分三步:

  1. 打开文件(Open)
  2. 读写内容(Read/Write)
  3. 关闭文件(Close)

1.1 打开与关闭

使用内置函数open()打开文件,使用.close()方法关闭文件。

# 1. 打开文件 (如果文件不存在,读取模式下会报错)# encoding='utf-8' 非常重要,防止中文乱码f=open("test.txt",mode="w",encoding="utf-8")# 2. 写入内容f.write("Hello, World!\n")f.write("这是我的第一个文件。")# 3. 关闭文件 (必须做!否则可能导致数据丢失或资源占用)f.close()

1.2 为什么必须关闭文件?

如果不关闭文件:

  • 数据可能还在缓冲区,没真正写入磁盘。
  • 操作系统限制同时打开的文件数量,打开太多会报错。
  • 可能会导致文件被锁定,其他程序无法访问。

1.3 最佳实践:with 语句 (上下文管理器)

为了防止忘记写f.close(),或者程序在读写过程中出错导致无法关闭文件,Python 提供了with语句。

它会在代码块执行完毕后(无论是否报错),自动关闭文件。

# 推荐写法withopen("test.txt","w",encoding="utf-8")asf:f.write("使用with语句自动关闭文件,真香!")# 离开缩进块后,文件已自动关闭

二、读取文件

假设我们有一个data.txt,内容如下:

Python Java C++ Go

2.1 读取全部内容 read()

withopen("data.txt","r",encoding="utf-8")asf:content=f.read()print(content)

注意:如果文件非常大(比如几GB),不要用read(),否则内存会爆掉。

2.2 读取一行 readline()

每次只读一行,适合逐行处理。

withopen("data.txt","r",encoding="utf-8")asf:line1=f.readline()line2=f.readline()print(f"第一行:{line1.strip()}")# strip() 去除末尾换行符print(f"第二行:{line2.strip()}")

2.3 读取所有行 readlines()

读取所有行并返回一个列表

withopen("data.txt","r",encoding="utf-8")asf:lines=f.readlines()print(lines)# ['Python\n', 'Java\n', 'C++\n', 'Go']

2.4 最常用的遍历方式

直接对文件对象进行for循环,这是最省内存、最高效的方式。

withopen("data.txt","r",encoding="utf-8")asf:forlineinf:print(line.strip())

三、写入文件

写入主要有两种模式:覆盖 (w)追加 (a)

3.1 覆盖写入 (w - Write)

  • 如果文件不存在:创建新文件。
  • 如果文件已存在:清空原内容,重新写入。
withopen("output.txt","w",encoding="utf-8")asf:f.write("旧的内容被清空了。\n")f.write("这是新的内容。")

3.2 追加写入 (a - Append)

  • 如果文件不存在:创建新文件。
  • 如果文件已存在:在文件末尾添加内容,原内容保留。
withopen("output.txt","a",encoding="utf-8")asf:f.write("\n这是追加的一行。")

四、文件操作模式汇总

open(file, mode=...)中的mode参数决定了操作方式。

模式描述文件不存在时文件存在时
r只读(默认)报错读取
w只写创建新文件清空并覆盖
a追加创建新文件末尾追加
x独占创建创建新文件报错 (防止覆盖)
b二进制模式 (如图片、音频)--
+更新 (可读可写)--

常见组合

  • rb: 读取二进制文件 (图片)
  • wb: 写入二进制文件
  • r+: 读写模式 (文件指针在开头)
  • a+: 追加读写模式 (文件指针在末尾)

五、处理二进制文件 (图片/视频)

复制一张图片需要使用rb(Read Binary) 和wb(Write Binary) 模式。

# 文件复制工具defcopy_file(src,dst):try:withopen(src,"rb")asf_src:content=f_src.read()withopen(dst,"wb")asf_dst:f_dst.write(content)print("复制成功!")exceptFileNotFoundError:print("源文件不存在!")# copy_file("photo.jpg", "photo_backup.jpg")

六、实战练习

练习1:简易日记本

编写一个程序,让用户输入内容,保存到diary.txt中。每次运行程序都能追加新日记,并自动记录时间。

importdatetimedefwrite_diary():now=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print("请输入日记内容 (输入 'q' 退出):")content=input("> ")ifcontent.lower()=='q':return# 使用追加模式 'a'withopen("diary.txt","a",encoding="utf-8")asf:f.write(f"[{now}]{content}\n")print("日记已保存!")# 运行write_diary()

练习2:给代码加行号

读取一个 Python 文件,给每一行前面加上行号,并保存为新文件。

defadd_line_numbers(input_file,output_file):try:withopen(input_file,"r",encoding="utf-8")asf_in:lines=f_in.readlines()withopen(output_file,"w",encoding="utf-8")asf_out:forindex,lineinenumerate(lines,1):# 格式化:行号占4位,右对齐f_out.write(f"{index:>4}|{line}")print(f"处理完成,已保存至{output_file}")exceptFileNotFoundError:print("文件未找到!")# 假设当前目录下有 test.py# add_line_numbers("test.py", "test_numbered.txt")

七、常见问题

Q1:UnicodeDecodeError是什么鬼?

这是最常见的错误,通常是因为读取文件时编码格式不对。

  • Windows 默认编码可能是GBK
  • Linux/Mac 默认是UTF-8
  • 解决方法:在open()中始终显式指定encoding='utf-8'

Q2:路径中的反斜杠\报错?

在 Windows 路径中,\是转义字符(如\n,\t)。

  • 错误写法:open("C:\new\test.txt")(\n被当成换行了)
  • 正确写法1 (双反斜杠):"C:\\new\\test.txt"
  • 正确写法2 (原始字符串 r):r"C:\new\test.txt"
  • 正确写法3 (推荐,使用正斜杠):"C:/new/test.txt"(Windows也支持)

八、小结

文件操作 File I/O

打开 open()

模式 Mode

关闭 close()

'r' 只读 (默认)

'w' 覆盖写入

'a' 追加写入

'b' 二进制

f.close()

with open() as f (自动关闭 - 推荐)

读写方法

read() / write()

readline() / readlines()

for line in f (遍历)

关键要点

  1. 始终使用with open(...)来管理文件,安全又省心。
  2. 始终指定encoding='utf-8',远离乱码烦恼。
  3. 处理大文件时,使用for line in f逐行读取,不要一次性read()
  4. 区分w(清空写) 和a(追加写) 的区别。

九、课后作业

  1. 文件统计:下载或创建一个英文文本文件(如一篇新闻),统计其中共有多少行、多少个字符(不含空格)。
  2. 数据清洗:有一个scores.txt,每一行是一个学生成绩(如Tom:85)。请读取文件,计算平均分,并将不及格(<60)的学生名单写入fail_list.txt
  3. 批量修改:编写一个脚本,将当前目录下所有.txt文件内的 “Hello” 替换为 “Hi”。

下节预告

Day 13:模块与包 (Modules & Packages)- 代码写多了,全堆在一个文件里太乱了。明天我们学习如何像搭积木一样管理和组织代码!


系列导航

  • 上一篇:Day 11 - 函数进阶
  • 下一篇:Day 13 - 模块与包(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1145998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电路仿真circuits网页版在模拟信号调理中的实践解析

用网页电路仿真玩转模拟信号调理&#xff1a;从零搭建心电前置放大器你有没有过这样的经历&#xff1f;手头有个传感器项目&#xff0c;信号微弱得像耳语&#xff0c;噪声却吵得像工地施工。想做个放大滤波电路&#xff0c;可一上电就失真、振荡、输出贴电源轨……改一次PCB要等…

Altium Designer铺铜与过孔连接方式详解

Altium Designer铺铜与过孔连接实战指南&#xff1a;从原理到一次成功的PCB设计你有没有遇到过这样的情况&#xff1f;明明所有走线都连上了&#xff0c;DRC检查却报出一堆“Unconnected Pin”&#xff1b;回流焊后发现几个接地过孔虚焊&#xff1b;高速信号完整性测试时噪声异…

RISC-V中断上下文保存与恢复流程系统学习

深入RISC-V中断机制&#xff1a;从硬件触发到上下文恢复的完整路径你有没有遇到过这样的问题——系统突然“卡死”&#xff0c;调试器显示程序跳到了一个完全意想不到的地方&#xff1f;或者在写中断服务例程时&#xff0c;发现某个变量莫名其妙地被改写了&#xff1f;如果你正…

PCB布局前的电路行为预判:电路仿真详解

PCB布局前的电路行为预判&#xff1a;为什么高手都在用仿真“排雷”&#xff1f;你有没有经历过这样的场景&#xff1f;PCB板子刚焊好&#xff0c;上电测试却发现电源振荡、信号失真、噪声超标……改版&#xff1f;又要等一周&#xff01;成本又涨几千&#xff01;更糟的是&…

新手必看:TPS5430 buck电路入门教程

从零开始搞懂TPS5430 Buck电路&#xff1a;新手也能轻松上手的实战指南 你是不是也曾在设计电源时&#xff0c;面对一堆参数和拓扑图一头雾水&#xff1f; 想给STM32、FPGA或者传感器供电&#xff0c;却不知道该用LDO还是DC-DC&#xff1f; 看到“buck电路图”、“环路补偿”…

HBuilderX Windows环境配置:新手教程(零基础必看)

从零开始玩转 HBuilderX&#xff1a;Windows 下的前端开发第一站你是不是也曾在搜索“前端怎么入门”时&#xff0c;被一堆专业术语搞得晕头转向&#xff1f;Webpack、Babel、TypeScript、Node.js……光是名字就让人想放弃。其实&#xff0c;前端开发的第一步&#xff0c;完全可…

MOSFET工作原理项目应用:DC-DC变换器驱动设计示例

从米勒效应到高效驱动&#xff1a;MOSFET在同步Buck变换器中的实战设计揭秘你有没有遇到过这样的情况&#xff1f;明明选了低导通电阻的MOSFET&#xff0c;效率却上不去&#xff1b;开关频率提不上去&#xff0c;温升还特别高&#xff1b;更离谱的是&#xff0c;示波器一测&…

持续提升专业技能和行业认知,利用碎片时间学习新工具或方法论

职场思维一&#xff1a;结果导向关注产出而非过程&#xff0c;以目标为驱动完成工作。将大目标拆解为可量化的小任务&#xff0c;定期复盘进度。例如设定季度业绩指标&#xff0c;每周检查完成度并及时调整策略。职场思维二&#xff1a;主动学习持续提升专业技能和行业认知&…

阐述多 Agent 系统中的组织模型设计:角色分配、权限管理与任务协同策略

阐述多 Agent 系统中的组织模型设计&#xff1a;角色分配、权限管理与任务协同策略 一、引言&#xff1a;为什么多 Agent 系统需要“组织模型” 随着人工智能系统从“单智能体”向“群体智能”演进&#xff0c;多 Agent 系统&#xff08;Multi-Agent System, MAS&#xff09;逐…

Xilinx Ultrascale+平台下XDMA配置全面讲解

Xilinx Ultrascale平台下XDMA实战配置全解析&#xff1a;从IP定制到Linux零拷贝传输 为什么高速数据通路离不开XDMA&#xff1f; 在如今的AI推理加速、雷达信号处理和医学成像系统中&#xff0c;FPGA作为协处理器的角色愈发关键。但一个常被忽视的问题是&#xff1a; 再强大…

基于改进多目标灰狼优化算法的考虑V2G技术的风、光、荷、储微网多目标日前优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【无功优化】“碳中和”目标下电气互联系统有功-无功协同优化模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Multisim仿真电路图实例详解H桥驱动电路正反转原理验证

用Multisim“手把手”验证H桥驱动&#xff1a;从零搞懂直流电机正反转原理你有没有遇到过这种情况——明明代码写对了&#xff0c;接线也没错&#xff0c;可电机一通电就“炸管”&#xff1f;或者方向调反了&#xff0c;想改又不敢动硬件&#xff0c;生怕再烧一颗MOSFET&#x…

强烈安利!9大AI论文网站测评,本科生毕业论文必备

强烈安利&#xff01;9大AI论文网站测评&#xff0c;本科生毕业论文必备 2026年AI论文工具测评&#xff1a;为何需要这份榜单&#xff1f; 在当前学术研究日益依赖AI辅助工具的背景下&#xff0c;本科生在撰写毕业论文时常常面临资料查找困难、写作效率低、格式不规范等问题。为…

MusicFree:开源多平台聚合音乐软件

数字音乐版权的分散化使得听众经常需要在多个应用程序之间切换。为了解决这种碎片化的体验&#xff0c;开源社区推出了 MusicFree。这款软件在本质上是一个集成播放协议的空壳&#xff0c;本身不带有任何曲库内容。它通过插件化的设计&#xff0c;将软件的功能性与内容源彻底剥…

【顶级SCI复现】高比例可再生能源并网如何平衡灵活性与储能成本?虚拟电厂多时间尺度调度及衰减建模(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

强烈安利9个AI论文平台,专科生搞定毕业论文不求人!

强烈安利9个AI论文平台&#xff0c;专科生搞定毕业论文不求人&#xff01; AI 工具让论文写作不再难 对于专科生来说&#xff0c;毕业论文可能是大学生活中最令人头疼的一关。面对繁杂的文献资料、复杂的格式要求和紧张的时间安排&#xff0c;很多同学感到无从下手。而如今&…

强烈安利9个AI论文工具,自考学生轻松搞定论文写作!

强烈安利9个AI论文工具&#xff0c;自考学生轻松搞定论文写作&#xff01; 自考论文写作&#xff0c;AI 工具如何成为你的得力助手&#xff1f; 对于自考学生而言&#xff0c;撰写论文不仅是学术能力的体现&#xff0c;更是完成学业的关键环节。然而&#xff0c;面对繁重的写作…

电子电路热设计优化:Altium Designer仿真示例

用Altium Designer“看见温度”&#xff1a;电子电路热设计实战全解析 你有没有遇到过这样的场景&#xff1f; 样机刚上电&#xff0c;手还没靠近电源模块&#xff0c;就闻到一股“熟悉的焦味”&#xff1b;示波器波形正常&#xff0c;但系统跑着跑着突然重启——查来查去&…

mptools v8.0烧录速度提升的五个关键设置

如何让 mptools v8.0 烧录快如闪电&#xff1f;这五个关键设置你必须掌握在电子量产线上&#xff0c;时间就是金钱。一个看似不起眼的固件烧录环节&#xff0c;可能正悄悄吞噬你的产能——原本每小时能打 200 片&#xff0c;结果因为烧录太慢卡在 80 片&#xff1b;交付周期被拉…