pythonDay 11 学习任务:与外部世界交互 - 文件操作——自动管理文件

B站影视 港台电影 2025-11-14 00:02 1

摘要:with open(文件名, 模式, encoding='utf-8') as 文件变量: # 在这里进行文件操作# 离开这个缩进块后,文件会自动关闭!# 传统方式(容易忘记关闭)file = open('test.txt', 'r')content = fi

在前面的学习中,我们总是强调要记得关闭文件:

file = open('example.txt', 'r')content = file.readfile.close # 必须记得关闭!

但有时候我们会忘记写 close,或者程序出错时文件没有被正确关闭。with 语句就是来解决这个问题的!

with open(文件名, 模式, encoding='utf-8') as 文件变量: # 在这里进行文件操作# 离开这个缩进块后,文件会自动关闭!# 传统方式(容易忘记关闭)file = open('test.txt', 'r')content = file.readfile.close# 使用 with 语句(推荐!)with open('test.txt', 'r', encoding='utf-8') as file: content = file.read# 文件自动关闭,不需要写 file.closedef 演示自动关闭: print("演示 with 语句的自动关闭功能") with open('演示文件.txt', 'w', encoding='utf-8') as file: file.write('这是第一行\n') file.write('这是第二行\n') # 不需要写 file.close! print("✅ 文件已自动关闭")演示自动关闭def 演示异常安全: """演示即使在出错时,文件也会被正确关闭""" try: with open('测试文件.txt', 'w', encoding='utf-8') as file: file.write('开始写入...\n') # 模拟一个错误 raise ValueError("出错了!") file.write('这行不会被执行\n') except ValueError as e: print(f"捕获到错误:{e}") print("✅ 但文件已经被正确关闭了!")演示异常安全# 读取整个文件with open('自我介绍.txt', 'r', encoding='utf-8') as file: 内容 = file.read print(内容)# 逐行读取with open('自我介绍.txt', 'r', encoding='utf-8') as file: for 行号, 行内容 in enumerate(file, 1): print(f"第{行号}行:{行内容}", end='')# 写入文件with open('日记.txt', 'w', encoding='utf-8') as file: file.write('2024年1月15日\n') file.write('今天学习了Python的with语句!\n') file.write('真的很方便!\n')print("✅ 日记写入完成,文件已自动关闭")# 追加内容with open('日记.txt', 'a', encoding='utf-8') as file: file.write('\n2024年1月16日\n') file.write('今天继续练习文件操作!\n')print("✅ 日记追加完成")

with 语句可以同时管理多个文件:

def 复制文件(源文件, 目标文件): """复制文件内容""" with open(源文件, 'r', encoding='utf-8') as 源: with open(目标文件, 'w', encoding='utf-8') as 目标: 内容 = 源.read 目标.write(内容) print(f"✅ 文件已从 '{源文件}' 复制到 '{目标文件}'")# 更简洁的写法(Python 3.10+)def 复制文件简洁版(源文件, 目标文件): """同时打开多个文件的简洁写法""" with ( open(源文件, 'r', encoding='utf-8') as 源, open(目标文件, 'w', encoding='utf-8') as 目标 ): 内容 = 源.read 目标.write(内容) print(f"✅ 文件复制完成!")# 使用示例复制文件('自我介绍.txt', '自我介绍备份.txt')def 记录日志(消息, 日志文件='系统日志.txt'): """使用 with 语句记录日志""" import datetime with open(日志文件, 'a', encoding='utf-8') as 日志: 时间戳 = datetime.datetime.now.strftime("%Y-%m-%d %H:%M:%S") 日志.write(f"[{时间戳}] {消息}\n") print(f" 日志已记录:{消息}")# 测试日志系统记录日志("程序启动")记录日志("用户登录成功")记录日志("数据处理完成")记录日志("程序正常退出")def 读取配置(配置文件='config.txt'): """读取配置文件""" # 如果配置文件不存在,创建默认配置 try: with open(配置文件, 'r', encoding='utf-8') as file: 配置内容 = file.read print(" 当前配置:") print(配置内容) return 配置内容 except FileNotFoundError: print("⚠️ 配置文件不存在,创建默认配置...") with open(配置文件, 'w', encoding='utf-8') as file: 默认配置 = """# 系统配置用户名=管理员语言=中文主题=暗色自动保存=是""" file.write(默认配置) return 默认配置def 更新配置(键, 值, 配置文件='config.txt'): """更新配置项""" with open(配置文件, 'r', encoding='utf-8') as file: 行列表 = file.readlines # 查找并更新配置项 已更新 = False for i in range(len(行列表)): if 行列表[i].startswith(键 + '='): 行列表[i] = f"{键}={值}\n" 已更新 = True break # 如果配置项不存在,添加到文件末尾 if not 已更新: 行列表.append(f"{键}={值}\n") # 写回文件 with open(配置文件, 'w', encoding='utf-8') as file: file.writelines(行列表) print(f"✅ 配置已更新:{键}={值}")# 使用示例读取配置更新配置('主题', '亮色')更新配置('新设置', '新值')def 备份数据(源文件, 备份目录='backups'): """备份文件到指定目录""" import os import datetime # 创建备份目录(如果不存在) if not os.path.exists(备份目录): os.makedirs(备份目录) print(f" 创建备份目录:{备份目录}") # 生成备份文件名(包含时间戳) 时间戳 = datetime.datetime.now.strftime("%Y%m%d_%H%M%S") 原文件名 = os.path.basename(源文件) 备份文件 = os.path.join(备份目录, f"{原文件名}.{时间戳}.bak") try: with open(源文件, 'r', encoding='utf-8') as 源: with open(备份文件, 'w', encoding='utf-8') as 目标: 内容 = 源.read 目标.write(内容) print(f"✅ 数据备份成功:{备份文件}") except FileNotFoundError: print(f"❌ 源文件不存在:{源文件}")# 使用示例备份数据('自我介绍.txt')def 演示错误处理: """演示 with 语句的错误处理""" print("开始演示错误处理...") try: with open('测试文件.txt', 'w', encoding='utf-8') as file: file.write('第一行内容\n') file.write('第二行内容\n') # 故意制造一个错误 print(不存在的变量) # 这里会报错! file.write('这行不会执行\n') except NameError as e: print(f"❌ 发生错误:{e}") # 检查文件是否已关闭 print("✅ 文件已经被正确关闭,即使发生了错误")演示错误处理def 转换文件编码(源文件, 目标文件, 源编码, 目标编码='utf-8'): """转换文件编码""" try: with open(源文件, 'r', encoding=源编码) as 源: with open(目标文件, 'w', encoding=目标编码) as 目标: 内容 = 源.read 目标.write(内容) print(f"✅ 编码转换完成:{源文件} -> {目标文件}") except UnicodeDecodeError: print(f"❌ 编码错误:无法用 {源编码} 读取文件") except FileNotFoundError: print(f"❌ 文件不存在:{源文件}")# 使用示例转换文件编码('gbk文件.txt', 'utf8文件.txt', 'gbk')def 分析文本文件(文件名): """分析文本文件的基本信息""" with open(文件名, 'r', encoding='utf-8') as file: 行列表 = file.readlines if not 行列表: print("文件为空!") return 总行数 = len(行列表) 总字符数 = sum(len(行) for 行 in 行列表) 非空行数 = sum(1 for 行 in 行列表 if 行.strip) 最长行 = max(行列表, key=len) print(f" 文件分析报告:{文件名}") print(f" 总行数:{总行数}") print(f" 非空行数:{非空行数}") print(f" 总字符数:{总字符数}") print(f" 最长行:{len(最长行.strip)} 字符") print(f" 最长行内容:{最长行.strip[:50]}...")# 使用示例分析文本文件('自我介绍.txt')# ✅ 推荐做法with open('file.txt', 'r') as file: data = file.read# ❌ 避免的做法file = open('file.txt', 'r')data = file.readfile.close # 可能忘记写!# ✅ 总是指定编码with open('file.txt', 'r', encoding='utf-8') as file: data = file.read# 对于大文件,逐行处理with open('大文件.txt', 'r', encoding='utf-8') as file: for 行 in file: # 处理每一行,避免内存不足 print(行.strip)读取"通讯录.txt"文件创建一个备份文件(包含时间戳)统计通讯录中的联系人数量将所有联系人的电话号码提取到新文件中def 通讯录分析工具: """通讯录分析工具""" 通讯录文件 = '通讯录.txt' try: # 1. 读取通讯录 with open(通讯录文件, 'r', encoding='utf-8') as file: 内容 = file.read print(" 通讯录内容:") print(内容) # 2. 创建备份 import datetime 时间戳 = datetime.datetime.now.strftime("%Y%m%d_%H%M%S") 备份文件 = f"通讯录备份_{时间戳}.txt" with open(通讯录文件, 'r', encoding='utf-8') as 源: with open(备份文件, 'w', encoding='utf-8') as 目标: 目标.write(源.read) print(f"✅ 备份创建成功:{备份文件}") # 3. 统计联系人数量(跳过表头) with open(通讯录文件, 'r', encoding='utf-8') as file: 行列表 = file.readlines 联系人数量 = len(行列表) - 3 # 减去表头 print(f" 联系人数量:{联系人数量}") # 4. 提取电话号码 with open(通讯录文件, 'r', encoding='utf-8') as 源: with open('电话号码列表.txt', 'w', encoding='utf-8') as 目标: 目标.write("电话号码列表\n") 目标.write("=" * 20 + "\n") for 行 in 源: if len(行.split) >= 3: # 简单的数据行检测 部分 = 行.split if len(部分) >= 3: 目标.write(f"{部分[2]}\n") # 假设电话号码在第三列 print("✅ 电话号码提取完成!") except FileNotFoundError: print("❌ 通讯录文件不存在!")# 运行练习通讯录分析工具

来源:琢磨先生起飞吧

相关推荐