课程主题
- 讲师:小甲鱼
- 核心任务:读取
record.txt文件,按规则分割对话内容并分文件保存 - 核心需求:文件数据处理 + 按条件分类保存 + 代码优化重构
任务核心规则
- 对话人物区分:小甲鱼的对话 → boy_开头文件;小客服的对话 → girl_开头文件
- 内容处理要求:去除「小甲鱼:」「小客服:」的前缀字符
- 文件拆分规则:文件内用连续等号分隔3段对话 → 生成 boy1/2/3.txt + girl1/2/3.txt 共6个文件
解题核心思路
- 打开目标文件
record.txt,按行读取内容 - 初始化2个列表:
boy = []存小甲鱼对话、girl = []存小客服对话 - 初始化计数器:
count = 1用于标记对话分段(1/2/3) - 逐行判断逻辑:
- 非分隔行:切割内容,分类存入对应列表
- 分隔行(连续等号):将列表内容写入对应文件,重置列表+计数器+1
- 循环结束后:处理最后一段未被保存的对话内容
核心操作知识点
1. 行内容判断(分隔符识别)
- 逻辑:判断每行内容前6个字符是否为等号,即可识别对话分隔行
- 作用:无需写完整等号串,简化判断逻辑
2. 字符串切割(关键去前缀)
- 使用字符串内置方法:
split('分隔符') - 用法:
role, spoken = each_line.split(':')- 按英文冒号切割每行内容,左侧是人物角色,右侧是纯对话内容
- 完美剔除「小甲鱼:」「小客服:」前缀,只保留有效对话
3. 内容分类存储
- 条件判断:
if role == '小甲鱼'→boy.append(spoken) - 条件判断:
if role == '小客服'→girl.append(spoken)
4. 文件写入核心方法
- 使用文件对象内置方法:
writelines(序列) - 优势:可直接将字符串列表一次性写入文件,适配我们的列表存储格式
- 打开模式:
open(文件名, 'w')写入模式,自动创建新文件
基础版代码实现(test1)完整逻辑
- 初始化变量:
boy = []、girl = []、count = 1 - 打开文件:
f = open('record.txt') - 循环逐行读取:
for each_line in f:- 分支① 非分隔行:切割→判断角色→追加到对应列表
- 分支② 分隔行:拼接文件名 → 打开文件 → writelines写入 → 关闭文件 → 重置列表 → count +=1
- 处理最后一段对话:把循环结束后boy/girl列表的内容,按count值写入最后一组文件
- 关闭源文件:
f.close()
- 必做操作:文件打开后必须调用close()关闭,释放资源
优化版代码实现(test2)核心优化点
核心痛点:基础版存在大量重复代码
- 重复代码块:文件保存的「拼接文件名-打开-写入-关闭-重置列表」逻辑出现2次
优化方案:函数封装 → 解耦+简洁+复用,代码更专业优雅
封装1:保存文件的功能 → save_file(boy, girl, count)
- 传入参数:小甲鱼对话列表、小客服对话列表、当前分段数
- 内部实现:所有文件保存相关逻辑全部封装在此函数内
- 拼接文件名:
boy_file_name = 'boy_' + str(count) + '.txt' - 拼接文件名:
girl_file_name = 'girl_' + str(count) + '.txt' - 打开文件+写入+关闭的全套操作
- 拼接文件名:
封装2:文件分割的核心逻辑 → split_file(file_name)
- 传入参数:目标文件名(如'record.txt')
- 内部实现:初始化变量、逐行读取、判断切割、分类存储、调用save_file(),所有分割逻辑封装在此
最终简化调用
- 主程序只需一行代码:
split_file('record.txt') - 代码结构清晰:仅2个自定义函数,各司其职,可读性拉满
易错点 & 注意事项
- 容易遗漏「最后一段对话」的保存,因为文件末尾无分隔行,循环内不会触发保存逻辑
- 文件打开后必须关闭,养成良好编码习惯
- split切割的分隔符要和文件内一致(英文冒号)
- 计数器count要在保存文件后自增,保证分段命名正确
- 写入模式'w'会覆盖同名文件,适合本次新建文件的需求