作者: 中文编程倡导者------ 李金雨
联系方式: wbtm2718@qq.com
系列: python中文编程入门教程** 核心理念: AI时代必须使用中文编程,母语编程阅读效率极高"
第12篇:文档操作------文件读写
开篇引入
本课目标
- 理解什么是文档(文件)
- 掌握如何打开和关闭文档
- 学会读取文档内容
- 学会写入文档内容
- 理解文件路径的概念
- 学会文件和文件夹操作
- 了解数据持久化的方法
生活场景引入
同学们,在日常生活中,我们经常需要处理各种文件:
- 写日记时,我们会将内容保存到笔记本中
- 拍照时,我们会将照片保存到相册中
- 学习时,我们会从课本中读取知识
- 工作时,我们会将数据保存到Excel文件中
在Python中,我们可以通过文件操作来读取和写入文件,实现数据的持久化存储。通过文件操作,我们可以将程序的数据保存到磁盘上,或者从磁盘上读取数据到程序中。
预期成果展示
在本课结束时,你将能够:
- 打开和关闭文件
- 读取文件内容
- 写入文件内容
- 处理文件路径
- 操作文件和文件夹
- 实现数据的持久化存储
- 编写一个日记本程序
概念讲解
1. 什么是文档(文件)
文件是存储在磁盘上的信息集合,具有文件名和扩展名。
文本文件:
- 包含人类可读的文本
- 扩展名通常为
.txt、.csv、.json等 - 可以用文本编辑器打开
二进制文件:
- 包含机器可读的二进制数据
- 扩展名通常为
.jpg、.png、.exe等 - 需要特定的程序才能打开
生活例子:
- 文本文件:日记、作文、代码文件
- 二进制文件:照片、视频、音乐
2. 打开和关闭文档
在Python中,我们使用open()函数来打开文件,使用close()方法来关闭文件。
open()功能:
- 语法:
open(文件名, 模式, encoding) - 文件名:文件的路径
- 模式:打开文件的模式('r'、'w'、'a'、'b'等)
- encoding:文件编码(通常为'utf-8')
文件模式:
| 模式 | 描述 |
|---|---|
| 'r' | 只读模式(默认) |
| 'w' | 写入模式,会覆盖原有内容 |
| 'a' | 追加模式,在文件末尾添加内容 |
| 'b' | 二进制模式 |
| 'r+' | 读写模式 |
| 'w+' | 读写模式,会覆盖原有内容 |
| 'a+' | 读写模式,在文件末尾添加内容 |
with语句(自动关闭):
- 使用
with语句可以自动关闭文件,不需要手动调用close() - 语法:
with open(文件名, 模式) as 文件对象:
代码示例:
python
# 方法1:手动关闭文件
文件 = open("学生数据.txt", "w", encoding="utf-8")
文件.write("张三,15,90\n")
文件.write("李四,16,85\n")
文件.close()
# 方法2:使用with语句(推荐)
with open("学生数据.txt", "a", encoding="utf-8") as 文件:
文件.write("王五,15,92\n")
# 文件会自动关闭
3. 读取文档
Python提供了多种读取文件的方法:
read():读取全部内容
- 语法:
文件对象.read() - 返回文件的全部内容
readline():读取一行
- 语法:
文件对象.readline() - 返回文件的一行内容
readlines():读取为列表
- 语法:
文件对象.readlines() - 返回包含文件所有行的列表
逐行读取(for循环):
- 语法:
for 行 in 文件对象: - 逐行读取文件内容
代码示例:
python
# 读取全部内容
with open("学生数据.txt", "r", encoding="utf-8") as 文件:
内容 = 文件.read()
print("文件内容:")
print(内容)
# 逐行读取
print("\n逐行读取:")
with open("学生数据.txt", "r", encoding="utf-8") as 文件:
for 行 in 文件:
行 = 行.strip() # 去掉换行符
print(行)
# 读取为列表
print("\n读取为列表:")
with open("学生数据.txt", "r", encoding="utf-8") as 文件:
行列表 = 文件.readlines()
print(行列表)
# 读取一行
print("\n读取一行:")
with open("学生数据.txt", "r", encoding="utf-8") as 文件:
第一行 = 文件.readline()
print("第一行:", 第一行)
第二行 = 文件.readline()
print("第二行:", 第二行)
4. 写入文档
Python提供了多种写入文件的方法:
write():写入字符串
- 语法:
文件对象.write(字符串) - 将字符串写入文件
writelines():写入列表
- 语法:
文件对象.writelines(列表) - 将列表中的字符串写入文件
覆盖写入和追加写入:
- 'w'模式:覆盖原有内容
- 'a'模式:在文件末尾添加内容
代码示例:
python
# 覆盖写入
with open("测试文件.txt", "w", encoding="utf-8") as 文件:
文件.write("这是第一行\n")
文件.write("这是第二行\n")
文件.write("这是第三行\n")
print("文件写入完成!")
# 追加写入
with open("测试文件.txt", "a", encoding="utf-8") as 文件:
文件.write("这是追加的一行\n")
print("文件追加完成!")
# 写入列表
行列表 = ["这是第一行\n", "这是第二行\n", "这是第三行\n"]
with open("测试文件2.txt", "w", encoding="utf-8") as 文件:
文件.writelines(行列表)
print("列表写入完成!")
5. 文件路径
相对路径:
- 相对于当前工作目录的路径
- 例如:
"学生数据.txt"、"data/学生数据.txt"
绝对路径:
- 从根目录开始的完整路径
- 例如:
"C:/Users/用户名/Desktop/学生数据.txt"(Windows)或"/home/用户名/学生数据.txt"(Linux/Mac)
路径拼接(os.path.join):
- 使用
os.path.join()函数拼接路径 - 可以避免跨平台路径分隔符的问题
代码示例:
python
import os
# 获取当前工作目录
当前目录 = os.getcwd()
print("当前工作目录:", 当前目录)
# 相对路径
相对路径 = "学生数据.txt"
print("相对路径:", 相对路径)
# 绝对路径
绝对路径 = os.path.join(当前目录, "学生数据.txt")
print("绝对路径:", 绝对路径)
# 检查路径是否存在
if os.path.exists(绝对路径):
print("文件存在")
else:
print("文件不存在")
6. 文件和文件夹操作
Python的os模块提供了文件和文件夹操作的功能:
检查文件是否存在 :os.path.exists(路径)
创建文件夹 :os.makedirs(路径, exist_ok=True)
删除文件 :os.remove(路径)
重命名文件 :os.rename(旧文件名, 新文件名)
获取文件大小 :os.path.getsize(路径)
获取文件修改时间 :os.path.getmtime(路径)
代码示例:
python
import os
# 检查文件是否存在
文件路径 = "学生数据.txt"
if os.path.exists(文件路径):
print(f"文件{文件路径}存在")
print(f"文件大小:{os.path.getsize(文件路径)} 字节")
else:
print(f"文件{文件路径}不存在")
# 创建文件夹
文件夹路径 = "数据文件夹"
os.makedirs(文件夹路径, exist_ok=True)
print(f"文件夹{文件夹路径}创建成功")
# 重命名文件
旧文件名 = "测试文件.txt"
新文件名 = "重命名的测试文件.txt"
if os.path.exists(旧文件名):
os.rename(旧文件名, 新文件名)
print(f"文件{旧文件名}已重命名为{新文件名}")
# 删除文件
要删除的文件 = "测试文件2.txt"
if os.path.exists(要删除的文件):
os.remove(要删除的文件)
print(f"文件{要删除的文件}已删除")
7. 数据持久化
数据持久化是指将程序中的数据保存到磁盘上,以便在程序下次运行时能够读取和使用。
保存数据到文件:
- 将数据转换为字符串
- 写入文件
从文件读取数据:
- 读取文件内容
- 将字符串转换为数据
CSV格式:
- 逗号分隔值格式
- 适合存储表格数据
- 可以用Excel打开
JSON格式:
- JavaScript对象表示法
- 适合存储结构化数据
- 支持嵌套结构
代码示例:
python
import json
# 保存数据到JSON文件
学生数据 = [
{"姓名": "张三", "年龄": 15, "成绩": 90},
{"姓名": "李四", "年龄": 16, "成绩": 85},
{"姓名": "王五", "年龄": 15, "成绩": 92}
]
with open("学生数据.json", "w", encoding="utf-8") as 文件:
json.dump(学生数据, 文件, ensure_ascii=False, indent=2)
print("数据已保存到JSON文件")
# 从JSON文件读取数据
with open("学生数据.json", "r", encoding="utf-8") as 文件:
读取的数据 = json.load(文件)
print("从JSON文件读取的数据:")
for 学生 in 读取的数据:
print(f"姓名:{学生['姓名']},年龄:{学生['年龄']},成绩:{学生['成绩']}")
# 保存数据到CSV文件
with open("学生数据.csv", "w", encoding="utf-8") as 文件:
# 写入表头
文件.write("姓名,年龄,成绩\n")
# 写入数据
for 学生 in 学生数据:
文件.write(f"{学生['姓名']},{学生['年龄']},{学生['成绩']}\n")
print("数据已保存到CSV文件")
# 从CSV文件读取数据
print("从CSV文件读取的数据:")
with open("学生数据.csv", "r", encoding="utf-8") as 文件:
# 读取表头
表头 = 文件.readline().strip().split(",")
print(表头)
# 读取数据
for 行 in 文件:
行 = 行.strip().split(",")
print(f"姓名:{行[0]},年龄:{行[1]},成绩:{行[2]}")
动手实践
基础练习(必做)
-
制作日记本程序:编写一个程序,实现写入和读取日记的功能
python# 日记本程序 def 写日记(): """写日记""" 日期 = input("请输入日期(格式:YYYY-MM-DD):") 内容 = input("请输入日记内容:") # 确保日记文件夹存在 import os 文件夹路径 = "日记" os.makedirs(文件夹路径, exist_ok=True) # 写入日记 文件名 = os.path.join(文件夹路径, f"{日期}.txt") with open(文件名, "w", encoding="utf-8") as 文件: 文件.write(f"日期:{日期}\n") 文件.write("\n") 文件.write(内容) print(f"日记已保存到{文件名}") def 读日记(): """读日记""" 日期 = input("请输入要查看的日期(格式:YYYY-MM-DD):") # 检查文件是否存在 import os 文件名 = os.path.join("日记", f"{日期}.txt") if os.path.exists(文件名): with open(文件名, "r", encoding="utf-8") as 文件: 内容 = 文件.read() print("\n日记内容:") print(内容) else: print(f"没有找到{日期}的日记") def 查看所有日记(): """查看所有日记""" import os 文件夹路径 = "日记" if os.path.exists(文件夹路径): 日记文件 = [f for f in os.listdir(文件夹路径) if f.endswith(".txt")] if 日记文件: print("所有日记:") for 日记 in 日记文件: 日期 = 日记.replace(".txt", "") print(f"- {日期}") else: print("没有日记") else: print("没有日记文件夹") # 主菜单 while True: print("\n日记本程序") print("1. 写日记") print("2. 读日记") print("3. 查看所有日记") print("4. 退出") 选择 = input("请输入你的选择:") if 选择 == "1": 写日记() elif 选择 == "2": 读日记() elif 选择 == "3": 查看所有日记() elif 选择 == "4": print("谢谢使用,再见!") break else: print("输入错误,请重新输入!") -
制作通讯录:编写一个程序,实现通讯录的增删改查功能,数据保存到文件
python# 通讯录程序 import os import json 通讯录文件 = "通讯录.json" def 加载通讯录(): """加载通讯录数据""" if os.path.exists(通讯录文件): with open(通讯录文件, "r", encoding="utf-8") as 文件: return json.load(文件) else: return [] def 保存通讯录(数据): """保存通讯录数据""" with open(通讯录文件, "w", encoding="utf-8") as 文件: json.dump(数据, 文件, ensure_ascii=False, indent=2) def 添加联系人(): """添加联系人""" 通讯录 = 加载通讯录() 姓名 = input("请输入姓名:") 电话 = input("请输入电话:") 邮箱 = input("请输入邮箱:") 联系人 = { "姓名": 姓名, "电话": 电话, "邮箱": 邮箱 } 通讯录.append(联系人) 保存通讯录(通讯录) print("联系人添加成功!") def 查看联系人(): """查看联系人""" 通讯录 = 加载通讯录() if 通讯录: print("通讯录:") for i, 联系人 in enumerate(通讯录, 1): print(f"{i}. 姓名:{联系人['姓名']},电话:{联系人['电话']},邮箱:{联系人['邮箱']}") else: print("通讯录为空") def 查找联系人(): """查找联系人""" 通讯录 = 加载通讯录() 姓名 = input("请输入要查找的姓名:") 找到 = False for 联系人 in 通讯录: if 联系人['姓名'] == 姓名: print(f"姓名:{联系人['姓名']},电话:{联系人['电话']},邮箱:{联系人['邮箱']}") 找到 = True break if not 找到: print(f"没有找到姓名为{姓名}的联系人") def 删除联系人(): """删除联系人""" 通讯录 = 加载通讯录() 姓名 = input("请输入要删除的姓名:") 找到 = False for i, 联系人 in enumerate(通讯录): if 联系人['姓名'] == 姓名: del 通讯录[i] 保存通讯录(通讯录) print(f"联系人{姓名}已删除") 找到 = True break if not 找到: print(f"没有找到姓名为{姓名}的联系人") # 主菜单 while True: print("\n通讯录程序") print("1. 添加联系人") print("2. 查看联系人") print("3. 查找联系人") print("4. 删除联系人") print("5. 退出") 选择 = input("请输入你的选择:") if 选择 == "1": 添加联系人() elif 选择 == "2": 查看联系人() elif 选择 == "3": 查找联系人() elif 选择 == "4": 删除联系人() elif 选择 == "5": print("谢谢使用,再见!") break else: print("输入错误,请重新输入!")
进阶练习(选做)
-
制作学生成绩管理系统 :编写一个程序,实现学生成绩的管理,数据保存到CSV文件
python# 学生成绩管理系统 import os import csv 成绩文件 = "学生成绩.csv" def 初始化文件(): """初始化成绩文件""" if not os.path.exists(成绩文件): with open(成绩文件, "w", newline="", encoding="utf-8") as 文件: 写入器 = csv.writer(文件) 写入器.writerow(["姓名", "语文", "数学", "英语", "总分", "平均分"]) def 添加成绩(): """添加成绩""" 初始化文件() 姓名 = input("请输入姓名:") 语文 = float(input("请输入语文成绩:")) 数学 = float(input("请输入数学成绩:")) 英语 = float(input("请输入英语成绩:")) 总分 = 语文 + 数学 + 英语 平均分 = 总分 / 3 with open(成绩文件, "a", newline="", encoding="utf-8") as 文件: 写入器 = csv.writer(文件) 写入器.writerow([姓名, 语文, 数学, 英语, 总分, 平均分]) print("成绩添加成功!") def 查看成绩(): """查看成绩""" if not os.path.exists(成绩文件): print("成绩文件不存在") return with open(成绩文件, "r", encoding="utf-8") as 文件: 读取器 = csv.reader(文件) for 行 in 读取器: print("\t".join(行)) def 统计成绩(): """统计成绩""" if not os.path.exists(成绩文件): print("成绩文件不存在") return 语文总分 = 0 数学总分 = 0 英语总分 = 0 人数 = 0 with open(成绩文件, "r", encoding="utf-8") as 文件: 读取器 = csv.reader(文件) 下一行 = next(读取器) # 跳过表头 for 行 in 读取器: 语文总分 += float(行[1]) 数学总分 += float(行[2]) 英语总分 += float(行[3]) 人数 += 1 if 人数 > 0: print(f"\n成绩统计:") print(f"总人数:{人数}") print(f"语文平均分:{语文总分 / 人数:.2f}") print(f"数学平均分:{数学总分 / 人数:.2f}") print(f"英语平均分:{英语总分 / 人数:.2f}") else: print("没有成绩数据") # 主菜单 while True: print("\n学生成绩管理系统") print("1. 添加成绩") print("2. 查看成绩") print("3. 统计成绩") print("4. 退出") 选择 = input("请输入你的选择:") if 选择 == "1": 添加成绩() elif 选择 == "2": 查看成绩() elif 选择 == "3": 统计成绩() elif 选择 == "4": print("谢谢使用,再见!") break else: print("输入错误,请重新输入!")
挑战练习(拓展)
-
制作配置文件管理程序 :编写一个程序,实现配置文件的读写和管理
python# 配置文件管理程序 import os import json 配置文件 = "config.json" def 加载配置(): """加载配置""" if os.path.exists(配置文件): with open(配置文件, "r", encoding="utf-8") as 文件: return json.load(文件) else: # 默认配置 return { "语言": "中文", "主题": "浅色", "字体大小": 12, "自动保存": True } def 保存配置(配置): """保存配置""" with open(配置文件, "w", encoding="utf-8") as 文件: json.dump(配置, 文件, ensure_ascii=False, indent=2) def 查看配置(): """查看配置""" 配置 = 加载配置() print("当前配置:") for 键, 值 in 配置.items(): print(f"{键}:{值}") def 修改配置(): """修改配置""" 配置 = 加载配置() print("当前配置:") for 键, 值 in 配置.items(): print(f"{键}:{值}") 要修改的键 = input("请输入要修改的配置项:") if 要修改的键 in 配置: 新值 = input(f"请输入{要修改的键}的新值:") # 根据原有值的类型转换 原有值类型 = type(配置[要修改的键]) if 原有值类型 == bool: 新值 = 新值.lower() == "true" elif 原有值类型 == int: 新值 = int(新值) 配置[要修改的键] = 新值 保存配置(配置) print("配置修改成功!") else: print(f"配置项{要修改的键}不存在") def 重置配置(): """重置配置""" 默认配置 = { "语言": "中文", "主题": "浅色", "字体大小": 12, "自动保存": True } 保存配置(默认配置) print("配置已重置为默认值!") # 主菜单 while True: print("\n配置文件管理程序") print("1. 查看配置") print("2. 修改配置") print("3. 重置配置") print("4. 退出") 选择 = input("请输入你的选择:") if 选择 == "1": 查看配置() elif 选择 == "2": 修改配置() elif 选择 == "3": 重置配置() elif 选择 == "4": print("谢谢使用,再见!") break else: print("输入错误,请重新输入!")
知识总结
核心概念回顾
- 文件:存储在磁盘上的信息集合
- 文本文件:包含人类可读的文本
- 二进制文件:包含机器可读的二进制数据
- 打开文件 :使用
open()函数打开文件 - 关闭文件 :使用
close()方法或with语句关闭文件 - 读取文件 :使用
read()、readline()、readlines()或for循环读取文件 - 写入文件 :使用
write()或writelines()写入文件 - 文件路径:相对路径或绝对路径
- 文件操作 :使用
os模块进行文件和文件夹操作 - 数据持久化:将数据保存到文件中
关键代码速查
| 功能 | 代码 | 说明 |
|---|---|---|
| 打开文件 | open(文件名, 模式, encoding) |
打开文件并返回文件对象 |
| 关闭文件 | 文件对象.close() |
关闭文件 |
| with语句 | with open(文件名, 模式) as 文件对象: |
自动关闭文件 |
| 读取全部内容 | 文件对象.read() |
读取文件的全部内容 |
| 读取一行 | 文件对象.readline() |
读取文件的一行内容 |
| 读取为列表 | 文件对象.readlines() |
读取文件的所有行到列表 |
| 写入字符串 | 文件对象.write(字符串) |
将字符串写入文件 |
| 写入列表 | 文件对象.writelines(列表) |
将列表中的字符串写入文件 |
| 检查文件是否存在 | os.path.exists(路径) |
检查文件或目录是否存在 |
| 创建文件夹 | os.makedirs(路径, exist_ok=True) |
创建目录,不存在则创建 |
| 删除文件 | os.remove(路径) |
删除文件 |
| 重命名文件 | os.rename(旧文件名, 新文件名) |
重命名文件 |
| 保存JSON | json.dump(数据, 文件) |
将数据保存为JSON格式 |
| 读取JSON | json.load(文件) |
从JSON文件读取数据 |
常见错误提醒
- 文件不存在:尝试打开不存在的文件进行读取
- 权限错误:没有权限读取或写入文件
- 编码错误:文件编码与指定的编码不匹配
- 路径错误:文件路径不正确
- 文件被占用:文件被其他程序占用,无法操作
- 忘记关闭文件 :没有调用
close()方法关闭文件
课后作业
巩固练习题
-
编写一个程序,读取一个文本文件的内容,统计其中的单词数量
-
编写一个程序,将一个文本文件的内容复制到另一个文件中
创意编程题
-
编写一个程序,实现一个简单的日志系统,记录程序的运行情况
-
编写一个程序,实现一个简单的图片查看器,显示指定目录下的图片
下篇预习提示
在下一篇中,我们将进行综合实战,制作一个完整的小游戏。请思考:
- 如何将之前所学的知识整合起来?
- 如何设计一个小游戏的结构?
- 如何实现游戏的核心功能?
学习交流
如果你在学习过程中遇到任何问题,欢迎联系我:
- ** 视频号,"时空系"
- 邮箱: wbtm2718@qq.com
- 其他提示:
- 本人正在开发纯中文编程语言和编译器,有兴趣的可以交流
- 本人正在写一本基于中国母语思维习惯的数学教材,可以让你一年内学完从初中到研究生的数学,而且可以让你快速掌握人工智能的关键数学知识,有兴趣的可以交流
祝你学习愉快!