第12篇:文档操作——文件读写 python中文编程

作者: 中文编程倡导者------ 李金雨
联系方式: 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]}")

动手实践

基础练习(必做)

  1. 制作日记本程序:编写一个程序,实现写入和读取日记的功能

    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("输入错误,请重新输入!")
  2. 制作通讯录:编写一个程序,实现通讯录的增删改查功能,数据保存到文件

    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("输入错误,请重新输入!")

进阶练习(选做)

  1. 制作学生成绩管理系统 :编写一个程序,实现学生成绩的管理,数据保存到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("输入错误,请重新输入!")

挑战练习(拓展)

  1. 制作配置文件管理程序 :编写一个程序,实现配置文件的读写和管理

    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文件读取数据

常见错误提醒

  1. 文件不存在:尝试打开不存在的文件进行读取
  2. 权限错误:没有权限读取或写入文件
  3. 编码错误:文件编码与指定的编码不匹配
  4. 路径错误:文件路径不正确
  5. 文件被占用:文件被其他程序占用,无法操作
  6. 忘记关闭文件 :没有调用close()方法关闭文件

课后作业

巩固练习题

  1. 编写一个程序,读取一个文本文件的内容,统计其中的单词数量

  2. 编写一个程序,将一个文本文件的内容复制到另一个文件中

创意编程题

  1. 编写一个程序,实现一个简单的日志系统,记录程序的运行情况

  2. 编写一个程序,实现一个简单的图片查看器,显示指定目录下的图片

下篇预习提示

在下一篇中,我们将进行综合实战,制作一个完整的小游戏。请思考:

  • 如何将之前所学的知识整合起来?
  • 如何设计一个小游戏的结构?
  • 如何实现游戏的核心功能?

学习交流

如果你在学习过程中遇到任何问题,欢迎联系我:

  • ** 视频号,"时空系"
  • 邮箱: wbtm2718@qq.com
  • 其他提示:
  • 本人正在开发纯中文编程语言和编译器,有兴趣的可以交流
  • 本人正在写一本基于中国母语思维习惯的数学教材,可以让你一年内学完从初中到研究生的数学,而且可以让你快速掌握人工智能的关键数学知识,有兴趣的可以交流

祝你学习愉快!

相关推荐
枫叶丹47 小时前
【HarmonyOS 6.0】Camera Kit 新增系统性能压力监听功能全解析
开发语言·计算机视觉·华为·harmonyos
十五年专注C++开发7 小时前
QtnProperty:一个基于 Qt 框架的第三方高级属性库
开发语言·c++·qt
2501_901006477 小时前
Golang map底层实现原理_Golang map哈希表原理教程【收藏】
jvm·数据库·python
yujunl7 小时前
U9的OpenAPI接口的应用
开发语言
keineahnung23457 小时前
為什麼這個 Tensor 算 dense?PyTorch _eval_is_non_overlapping_and_dense 深入解析
人工智能·pytorch·python·深度学习
沐知全栈开发7 小时前
JSP 表单处理
开发语言
AI进化营-智能译站7 小时前
ROS2 C++开发系列04:如何有效输出机器人状态
开发语言·c++·ai·机器人
AI进化营-智能译站7 小时前
ROS2 C++开发系列05:机器人启动如何传递命令行参数实战
开发语言·c++·ai·机器人
寒山独见君~7 小时前
自动化-消息推送Server酱3,APP推送
运维·数据库·python·自动化·通知