Python 零基础入门系列十二文件操作详解掌握数据持久化的钥匙读写硬盘文件 系列说明在前一篇中我们学习了如何使用模块和包来组织代码。代码是程序的骨架而数据则是程序的灵魂。到目前为止我们的数据大多存储在内存中程序一关闭数据就消失了。本文将教你如何使用 Python 进行文件操作让数据保存到硬盘中实现“永久”存储。 更新时间2026 年 3 月 29 日 本篇你将学到文件的打开与关闭、读写操作文本与二进制、with语句、常用文件操作模块⏱️ 预计阅读时间50-60 分钟 | 实践时间40-50 分钟 前置知识已完成前九篇特别是字符串操作✍️ 作者书到用时方恨少! 前言为什么要文件操作在之前的编程练习中我们使用的变量、列表、字典中的数据都存储在计算机的内存RAM中。内存的特点是读写速度快但断电即失。一旦程序运行结束或电脑重启数据就会消失。为了保存重要的数据如用户信息、游戏存档、日志记录我们需要将数据存储在硬盘上。这就是文件操作File I/O的意义所在。1. 文件操作基础在 Python 中操作文件的标准流程是打开 - 读/写 - 关闭。1.1 文件路径Path文件路径分为绝对路径和相对路径。绝对路径从磁盘根目录开始的完整路径如C:\Users\Name\file.txt或/home/user/file.txt。相对路径相对于当前工作目录Current Working Directory的路径。获取当前工作目录importosprint(os.getcwd())# 查看当前脚本运行的目录1.2 打开文件open()Python 使用内置的open()函数来打开文件它会返回一个文件对象File Object。语法file_objectopen(file,moder,encodingNone)file文件路径。mode打开模式读、写、追加等。encoding编码格式处理中文时通常设为utf-8。1.3 关闭文件close()使用完文件后必须调用close()方法关闭文件。为什么必须关闭释放操作系统资源。确保数据真正写入硬盘缓冲区刷新。1.4 文件打开模式Mode模式说明注意点r读取默认文件必须存在否则报错。w写入会覆盖原文件内容。文件不存在则创建。a追加写入的内容会加在文件末尾。文件不存在则创建。b二进制模式用于图片、音频等非文本文件通常与 r/w 组合如rb。读写模式可读可写如r,w。2. 读取文件首先我们创建一个名为poem.txt的文件写入以下内容用于测试床前明月光疑是地上霜。 举头望明月低头思故乡。2.1read(size)读取指定或全部内容不传参数读取文件全部内容返回一个字符串。传参数读取指定字节数size。# 1. 打开文件fopen(poem.txt,r,encodingutf-8)# 2. 读取内容contentf.read()print(content)# 3. 关闭文件f.close()2.2readline()读取一行每次读取文件的一行包括换行符\n通常用于循环读取。fopen(poem.txt,r,encodingutf-8)line1f.readline()line2f.readline()print(f第一行{line1.strip()})# .strip() 去除换行符print(f第二行{line2.strip()})f.close()2.3readlines()读取所有行一次性读取所有行返回一个列表列表中的每个元素是一行字符串。fopen(poem.txt,r,encodingutf-8)linesf.readlines()forlineinlines:print(f内容{line.strip()})f.close()3. 写入文件3.1write(string)写入字符串将字符串写入文件。3.2writelines(list)写入字符串列表将字符串列表写入文件。注意它不会自动换行3.3 覆盖写入 vs 追加写入w模式清空原文件写入新内容。a模式保留原文件在末尾追加新内容。示例写入日志# 使用 w 模式覆盖只保留最后一次记录withopen(log.txt,w,encodingutf-8)asf:f.write(这是第一条记录\n)# 使用 a 模式追加保留历史记录withopen(log.txt,a,encodingutf-8)asf:f.write(这是第二条追加记录\n)# 再次追加withopen(log.txt,a,encodingutf-8)asf:f.write(这是第三条追加记录\n)最终log.txt文件内容这是第二条追加记录 这是第三条追加记录(注第一条被 ‘w’ 模式覆盖删除了)4. 上下文管理器with语句在实际开发中我们很少手动调用close()因为如果程序在读写过程中出错close()可能无法执行导致文件被占用。with语句可以自动处理文件的关闭无论程序是否出错文件都会被正确关闭。语法withopen(文件名,模式,encodingutf-8)as变量名:# 执行读写操作content变量名.read()# 离开缩进块后文件自动关闭推荐写法# 读取文件推荐withopen(poem.txt,r,encodingutf-8)asf:contentf.read()print(content)# 文件在此处已自动关闭# 写入文件推荐withopen(output.txt,w,encodingutf-8)asf:f.write(Hello, World!)# 文件在此处已自动关闭5. 二进制文件操作文本文件r/w只能处理字符串。如果要处理图片、视频、音频、PDF 等非文本文件必须使用二进制模式b。5.1 图片的复制我们将演示如何读取一张图片并复制到新文件。# 二进制读取模式 rbwithopen(source.jpg,rb)assrc:# 二进制写入模式 wbwithopen(copy.jpg,wb)asdst:# 读取源文件的所有字节datasrc.read()# 将字节写入目标文件dst.write(data)print(图片复制完成)6. 常用文件系统模块除了直接操作文件内容我们经常需要操作文件本身如重命名、删除、判断是否存在。Python 提供了强大的标准库。6.1os.path模块用于处理文件路径。importos file_pathC:/Users/Example/Documents/test.txt# 1. 判断文件是否存在ifos.path.exists(file_path):print(文件存在)# 2. 判断是文件还是目录ifos.path.isfile(file_path):print(这是一个文件)ifos.path.isdir(file_path):print(这是一个目录)# 3. 获取文件名和后缀print(os.path.basename(file_path))# test.txtprint(os.path.splitext(file_path))# (C:/.../test, .txt)# 4. 路径拼接跨平台兼容new_pathos.path.join(folder,sub,file.txt)print(new_path)6.2shutil模块高级文件操作用于文件的复制、移动、打包等。importshutil# 1. 复制文件shutil.copy(source.txt,backup/source.txt)# 2. 复制整个目录树# shutil.copytree(source_folder, backup_folder)# 3. 移动/重命名文件shutil.move(old_name.txt,new_name.txt)# 4. 删除目录非空也可删慎用# shutil.rmtree(folder_to_delete)7. 综合实战学生成绩管理系统文件版在之前的函数练习中我们的数据是存储在内存列表里的。现在我们利用文件操作让数据能保存下来。功能要求程序启动时从students.txt加载数据到内存。支持添加学生信息。支持查询学生信息。程序退出时将内存中的数据保存回students.txt。代码实现importos# 文件名FILENAMEstudents.txtdefload_data():加载数据students[]ifos.path.exists(FILENAME):withopen(FILENAME,r,encodingutf-8)asf:forlineinf:# 假设文件格式姓名,年龄,成绩partsline.strip().split(,)iflen(parts)3:name,age,scoreparts students.append({name:name,age:int(age),score:float(score)})returnstudentsdefsave_data(students):保存数据withopen(FILENAME,w,encodingutf-8)asf:forsinstudents:f.write(f{s[name]},{s[age]},{s[score]}\n)print(数据已保存)defadd_student(students):nameinput(请输入姓名)ageint(input(请输入年龄))scorefloat(input(请输入成绩))students.append({name:name,age:age,score:score})print(添加成功)defshow_students(students):print(\n--- 学生列表 ---)forsinstudents:print(f姓名:{s[name]}, 年龄:{s[age]}, 成绩:{s[score]})defmain():# 1. 加载数据studentsload_data()print(f已加载{len(students)}条数据。)whileTrue:print(\n--- 菜单 ---)print(1. 添加学生)print(2. 显示学生)print(3. 保存并退出)choiceinput(请选择)ifchoice1:add_student(students)elifchoice2:show_students(students)elifchoice3:save_data(students)print(再见)breakelse:print(无效选择请重试。)if__name____main__:main() 结语通过本篇的学习你已经掌握了 Python 数据持久化的核心技能——文件 I/O 操作。你学会了使用open()函数和with语句安全地读写文件。你理解了文本模式与二进制模式的区别。你掌握了os.path和shutil等模块来管理文件系统。现在你的程序终于可以“记住”东西了下一步建议尝试修改上面的“学生成绩管理系统”增加“删除学生”和“修改成绩”的功能并尝试将数据格式改为 JSON 格式存储使用上一篇学的json模块。 下一篇预告《Python 零基础入门系列十三异常处理》程序运行时难免会遇到错误如除零错误、文件不存在。下一篇我们将学习如何优雅地处理这些错误防止程序崩溃。更新时间2026 年 3 月 29 日✍️作者书到用时方恨少!
Python 零基础入门系列(十二):文件操作详解
发布时间:2026/5/25 1:28:37
Python 零基础入门系列十二文件操作详解掌握数据持久化的钥匙读写硬盘文件 系列说明在前一篇中我们学习了如何使用模块和包来组织代码。代码是程序的骨架而数据则是程序的灵魂。到目前为止我们的数据大多存储在内存中程序一关闭数据就消失了。本文将教你如何使用 Python 进行文件操作让数据保存到硬盘中实现“永久”存储。 更新时间2026 年 3 月 29 日 本篇你将学到文件的打开与关闭、读写操作文本与二进制、with语句、常用文件操作模块⏱️ 预计阅读时间50-60 分钟 | 实践时间40-50 分钟 前置知识已完成前九篇特别是字符串操作✍️ 作者书到用时方恨少! 前言为什么要文件操作在之前的编程练习中我们使用的变量、列表、字典中的数据都存储在计算机的内存RAM中。内存的特点是读写速度快但断电即失。一旦程序运行结束或电脑重启数据就会消失。为了保存重要的数据如用户信息、游戏存档、日志记录我们需要将数据存储在硬盘上。这就是文件操作File I/O的意义所在。1. 文件操作基础在 Python 中操作文件的标准流程是打开 - 读/写 - 关闭。1.1 文件路径Path文件路径分为绝对路径和相对路径。绝对路径从磁盘根目录开始的完整路径如C:\Users\Name\file.txt或/home/user/file.txt。相对路径相对于当前工作目录Current Working Directory的路径。获取当前工作目录importosprint(os.getcwd())# 查看当前脚本运行的目录1.2 打开文件open()Python 使用内置的open()函数来打开文件它会返回一个文件对象File Object。语法file_objectopen(file,moder,encodingNone)file文件路径。mode打开模式读、写、追加等。encoding编码格式处理中文时通常设为utf-8。1.3 关闭文件close()使用完文件后必须调用close()方法关闭文件。为什么必须关闭释放操作系统资源。确保数据真正写入硬盘缓冲区刷新。1.4 文件打开模式Mode模式说明注意点r读取默认文件必须存在否则报错。w写入会覆盖原文件内容。文件不存在则创建。a追加写入的内容会加在文件末尾。文件不存在则创建。b二进制模式用于图片、音频等非文本文件通常与 r/w 组合如rb。读写模式可读可写如r,w。2. 读取文件首先我们创建一个名为poem.txt的文件写入以下内容用于测试床前明月光疑是地上霜。 举头望明月低头思故乡。2.1read(size)读取指定或全部内容不传参数读取文件全部内容返回一个字符串。传参数读取指定字节数size。# 1. 打开文件fopen(poem.txt,r,encodingutf-8)# 2. 读取内容contentf.read()print(content)# 3. 关闭文件f.close()2.2readline()读取一行每次读取文件的一行包括换行符\n通常用于循环读取。fopen(poem.txt,r,encodingutf-8)line1f.readline()line2f.readline()print(f第一行{line1.strip()})# .strip() 去除换行符print(f第二行{line2.strip()})f.close()2.3readlines()读取所有行一次性读取所有行返回一个列表列表中的每个元素是一行字符串。fopen(poem.txt,r,encodingutf-8)linesf.readlines()forlineinlines:print(f内容{line.strip()})f.close()3. 写入文件3.1write(string)写入字符串将字符串写入文件。3.2writelines(list)写入字符串列表将字符串列表写入文件。注意它不会自动换行3.3 覆盖写入 vs 追加写入w模式清空原文件写入新内容。a模式保留原文件在末尾追加新内容。示例写入日志# 使用 w 模式覆盖只保留最后一次记录withopen(log.txt,w,encodingutf-8)asf:f.write(这是第一条记录\n)# 使用 a 模式追加保留历史记录withopen(log.txt,a,encodingutf-8)asf:f.write(这是第二条追加记录\n)# 再次追加withopen(log.txt,a,encodingutf-8)asf:f.write(这是第三条追加记录\n)最终log.txt文件内容这是第二条追加记录 这是第三条追加记录(注第一条被 ‘w’ 模式覆盖删除了)4. 上下文管理器with语句在实际开发中我们很少手动调用close()因为如果程序在读写过程中出错close()可能无法执行导致文件被占用。with语句可以自动处理文件的关闭无论程序是否出错文件都会被正确关闭。语法withopen(文件名,模式,encodingutf-8)as变量名:# 执行读写操作content变量名.read()# 离开缩进块后文件自动关闭推荐写法# 读取文件推荐withopen(poem.txt,r,encodingutf-8)asf:contentf.read()print(content)# 文件在此处已自动关闭# 写入文件推荐withopen(output.txt,w,encodingutf-8)asf:f.write(Hello, World!)# 文件在此处已自动关闭5. 二进制文件操作文本文件r/w只能处理字符串。如果要处理图片、视频、音频、PDF 等非文本文件必须使用二进制模式b。5.1 图片的复制我们将演示如何读取一张图片并复制到新文件。# 二进制读取模式 rbwithopen(source.jpg,rb)assrc:# 二进制写入模式 wbwithopen(copy.jpg,wb)asdst:# 读取源文件的所有字节datasrc.read()# 将字节写入目标文件dst.write(data)print(图片复制完成)6. 常用文件系统模块除了直接操作文件内容我们经常需要操作文件本身如重命名、删除、判断是否存在。Python 提供了强大的标准库。6.1os.path模块用于处理文件路径。importos file_pathC:/Users/Example/Documents/test.txt# 1. 判断文件是否存在ifos.path.exists(file_path):print(文件存在)# 2. 判断是文件还是目录ifos.path.isfile(file_path):print(这是一个文件)ifos.path.isdir(file_path):print(这是一个目录)# 3. 获取文件名和后缀print(os.path.basename(file_path))# test.txtprint(os.path.splitext(file_path))# (C:/.../test, .txt)# 4. 路径拼接跨平台兼容new_pathos.path.join(folder,sub,file.txt)print(new_path)6.2shutil模块高级文件操作用于文件的复制、移动、打包等。importshutil# 1. 复制文件shutil.copy(source.txt,backup/source.txt)# 2. 复制整个目录树# shutil.copytree(source_folder, backup_folder)# 3. 移动/重命名文件shutil.move(old_name.txt,new_name.txt)# 4. 删除目录非空也可删慎用# shutil.rmtree(folder_to_delete)7. 综合实战学生成绩管理系统文件版在之前的函数练习中我们的数据是存储在内存列表里的。现在我们利用文件操作让数据能保存下来。功能要求程序启动时从students.txt加载数据到内存。支持添加学生信息。支持查询学生信息。程序退出时将内存中的数据保存回students.txt。代码实现importos# 文件名FILENAMEstudents.txtdefload_data():加载数据students[]ifos.path.exists(FILENAME):withopen(FILENAME,r,encodingutf-8)asf:forlineinf:# 假设文件格式姓名,年龄,成绩partsline.strip().split(,)iflen(parts)3:name,age,scoreparts students.append({name:name,age:int(age),score:float(score)})returnstudentsdefsave_data(students):保存数据withopen(FILENAME,w,encodingutf-8)asf:forsinstudents:f.write(f{s[name]},{s[age]},{s[score]}\n)print(数据已保存)defadd_student(students):nameinput(请输入姓名)ageint(input(请输入年龄))scorefloat(input(请输入成绩))students.append({name:name,age:age,score:score})print(添加成功)defshow_students(students):print(\n--- 学生列表 ---)forsinstudents:print(f姓名:{s[name]}, 年龄:{s[age]}, 成绩:{s[score]})defmain():# 1. 加载数据studentsload_data()print(f已加载{len(students)}条数据。)whileTrue:print(\n--- 菜单 ---)print(1. 添加学生)print(2. 显示学生)print(3. 保存并退出)choiceinput(请选择)ifchoice1:add_student(students)elifchoice2:show_students(students)elifchoice3:save_data(students)print(再见)breakelse:print(无效选择请重试。)if__name____main__:main() 结语通过本篇的学习你已经掌握了 Python 数据持久化的核心技能——文件 I/O 操作。你学会了使用open()函数和with语句安全地读写文件。你理解了文本模式与二进制模式的区别。你掌握了os.path和shutil等模块来管理文件系统。现在你的程序终于可以“记住”东西了下一步建议尝试修改上面的“学生成绩管理系统”增加“删除学生”和“修改成绩”的功能并尝试将数据格式改为 JSON 格式存储使用上一篇学的json模块。 下一篇预告《Python 零基础入门系列十三异常处理》程序运行时难免会遇到错误如除零错误、文件不存在。下一篇我们将学习如何优雅地处理这些错误防止程序崩溃。更新时间2026 年 3 月 29 日✍️作者书到用时方恨少!