2026/4/3 4:48:05
网站建设
项目流程
宁波网站建设公司哪家好,明星个人网页制作教程,创意空间设计,品牌设计法则徐适Day 12#xff1a;【99天精通Python】文件操作 - 让数据持久化保存
前言
欢迎来到第12天#xff01;
在前面的11天里#xff0c;我们写的所有程序#xff0c;数据都保存在内存中。一旦程序运行结束或者电脑关机#xff0c;那些辛苦计算出来的结果、用户输入的信息瞬间就消…Day 12【99天精通Python】文件操作 - 让数据持久化保存前言欢迎来到第12天在前面的11天里我们写的所有程序数据都保存在内存中。一旦程序运行结束或者电脑关机那些辛苦计算出来的结果、用户输入的信息瞬间就消失了。为了让数据能够长久保存持久化我们需要把数据写入到磁盘上的文件中。今天我们将学习Python中的**文件I/O输入/输出**操作。学会了这一招你就能做很多实用的事情了比如写日志、处理Excel数据CSV、读取配置文件等。本节内容文件的打开与关闭最佳实践with语句读取文件内容全量读、按行读写入文件内容覆盖写、追加写文件操作模式汇总实战练习一、文件的基本操作流程操作文件就像把大象装进冰箱总共分三步打开文件(Open)读写内容(Read/Write)关闭文件(Close)1.1 打开与关闭使用内置函数open()打开文件使用.close()方法关闭文件。# 1. 打开文件 (如果文件不存在读取模式下会报错)# encodingutf-8 非常重要防止中文乱码fopen(test.txt,modew,encodingutf-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,encodingutf-8)asf:f.write(使用with语句自动关闭文件真香)# 离开缩进块后文件已自动关闭二、读取文件假设我们有一个data.txt内容如下Python Java C Go2.1 读取全部内容 read()withopen(data.txt,r,encodingutf-8)asf:contentf.read()print(content)注意如果文件非常大比如几GB不要用read()否则内存会爆掉。2.2 读取一行 readline()每次只读一行适合逐行处理。withopen(data.txt,r,encodingutf-8)asf:line1f.readline()line2f.readline()print(f第一行:{line1.strip()})# strip() 去除末尾换行符print(f第二行:{line2.strip()})2.3 读取所有行 readlines()读取所有行并返回一个列表。withopen(data.txt,r,encodingutf-8)asf:linesf.readlines()print(lines)# [Python\n, Java\n, C\n, Go]2.4 最常用的遍历方式直接对文件对象进行for循环这是最省内存、最高效的方式。withopen(data.txt,r,encodingutf-8)asf:forlineinf:print(line.strip())三、写入文件写入主要有两种模式覆盖 (w)和追加 (a)。3.1 覆盖写入 (w - Write)如果文件不存在创建新文件。如果文件已存在清空原内容重新写入。withopen(output.txt,w,encodingutf-8)asf:f.write(旧的内容被清空了。\n)f.write(这是新的内容。)3.2 追加写入 (a - Append)如果文件不存在创建新文件。如果文件已存在在文件末尾添加内容原内容保留。withopen(output.txt,a,encodingutf-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:contentf_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():nowdatetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)print(请输入日记内容 (输入 q 退出):)contentinput( )ifcontent.lower()q:return# 使用追加模式 awithopen(diary.txt,a,encodingutf-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,encodingutf-8)asf_in:linesf_in.readlines()withopen(output_file,w,encodingutf-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)七、常见问题Q1UnicodeDecodeError是什么鬼这是最常见的错误通常是因为读取文件时编码格式不对。Windows 默认编码可能是GBK。Linux/Mac 默认是UTF-8。解决方法在open()中始终显式指定encodingutf-8。Q2路径中的反斜杠\报错在 Windows 路径中\是转义字符如\n,\t。错误写法open(C:\new\test.txt)(\n被当成换行了)正确写法1 (双反斜杠)C:\\new\\test.txt正确写法2 (原始字符串 r)rC:\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 (遍历)关键要点始终使用with open(...)来管理文件安全又省心。始终指定encodingutf-8远离乱码烦恼。处理大文件时使用for line in f逐行读取不要一次性read()。区分w(清空写) 和a(追加写) 的区别。九、课后作业文件统计下载或创建一个英文文本文件如一篇新闻统计其中共有多少行、多少个字符不含空格。数据清洗有一个scores.txt每一行是一个学生成绩如Tom:85。请读取文件计算平均分并将不及格60的学生名单写入fail_list.txt。批量修改编写一个脚本将当前目录下所有.txt文件内的 “Hello” 替换为 “Hi”。下节预告Day 13模块与包 (Modules Packages)- 代码写多了全堆在一个文件里太乱了。明天我们学习如何像搭积木一样管理和组织代码系列导航上一篇Day 11 - 函数进阶下一篇Day 13 - 模块与包待更新