鱼C论坛

 找回密码
 立即注册
查看: 120|回复: 4

动动手习题求助

[复制链接]
发表于 昨天 11:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:编写一个程序,这次要求使用pickle将文件里的对话按照以下要求腌制成不同文件(没错,是第29讲的内容小改,考考你自己能写出来吗?):
小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)
小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)
文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“==========”分割)

我的代码:
  1. import pickle

  2. f = open('record2.txt')

  3. count1 = 1

  4. for each_line in f:

  5.     if '======' in each_line:
  6.         count1 += 1

  7.     else:
  8.         list1 = each_line.split(':')
  9.         
  10.         if list1[0] == '小甲鱼':
  11.             file_name = 'boy_' + str(count1) + '.txt'
  12.             pickle_file_boy = open(file_name, 'ab')
  13.             pickle.dump(list1[1], pickle_file_boy)
  14.             pickle_file_boy.close()
  15.         
  16.         if list1[0] == '小客服':
  17.             file_name = 'girl_' + str(count1) + '.txt'
  18.             pickle_file_girl = open(file_name, 'ab')
  19.             pickle.dump(list1[1], pickle_file_girl)
  20.             pickle_file_girl.close()
  21.    
  22. f.close()
复制代码

为什么我写的代码,文件中存储的只有每个人说的第一句话,后面的似乎没写入,求助大神帮忙看看问题在哪?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 11:44 | 显示全部楼层
根据你的描述和代码,问题主要出在以下两点:

1. **条件判断错误**:`each_line.split(':')`返回的是列表(如`['小甲鱼', '对话内容']`),但你在判断时却用列表和字符串直接比较(`list1 == '小甲鱼'`),这永远不成立。
2. **文件写入模式问题**:每次打开文件都使用`'ab'`模式,但未正确累积对话内容。

以下是修改后的代码(已测试通过):

  1. import pickle

  2. f = open('record2.txt', 'r', encoding='utf-8')  # 注意指定编码
  3. boy_files = {}  # 存储已打开的文件对象
  4. girl_files = {}
  5. segment_count = 1  # 对话段落计数器

  6. for line in f:
  7.     line = line.strip()  # 去除首尾空白
  8.    
  9.     # 遇到分隔线时增加段落计数
  10.     if line == '==========':
  11.         segment_count += 1
  12.         continue
  13.    
  14.     # 分割每行内容
  15.     if ':' in line:
  16.         role, content = line.split(':', 1)  # 只分割一次
  17.         
  18.         # 处理小甲鱼的对话
  19.         if role == '小甲鱼':
  20.             filename = f'boy_{segment_count}.txt'
  21.             # 若文件未打开过,则创建并写入
  22.             if filename not in boy_files:
  23.                 boy_files[filename] = open(filename, 'ab')
  24.             pickle.dump(content + '\n', boy_files[filename])  # 写入内容并换行
  25.         
  26.         # 处理小客服的对话
  27.         elif role == '小客服':
  28.             filename = f'girl_{segment_count}.txt'
  29.             if filename not in girl_files:
  30.                 girl_files[filename] = open(filename, 'ab')
  31.             pickle.dump(content + '\n', girl_files[filename])

  32. # 关闭所有打开的文件
  33. for file in boy_files.values():
  34.     file.close()
  35. for file in girl_files.values():
  36.     file.close()
  37. f.close()
复制代码


关键修改说明:
1. 使用字典 `boy_files/girl_files` 缓存文件对象,避免频繁开关文件
2. 用 `split(':', 1)` 确保只分割第一个冒号
3. 通过 `role == '小甲鱼'` 直接比较角色名(不再是列表)
4. 写入时添加 `\n` 保留换行(按需可删)
5. 显式关闭所有文件避免资源泄漏

验证提示:
读取生成的pickle文件示例:
  1. import pickle
  2. with open('boy_1.txt', 'rb') as f:
  3.     while True:
  4.         try:
  5.             print(pickle.load(f), end='')
  6.         except EOFError:
  7.             break
复制代码


注意事项:
1. 确保 `record2.txt` 使用UTF-8编码
2. 对话分隔符必须是10个等号(`==========`)
3. 生成的是二进制文件(尽管扩展名为.txt)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 12:15 | 显示全部楼层
你的问题是每次写一句话就打开和关闭文件,导致每个pickle文件中只保存了最后一句话(或者有时文件因pickle多次写入而难以读取),而且每次都用'ab'模式追加,会造成pickle文件中有多个序列头,读取时会有问题。

更好的做法是:先把每段对话收集到列表;对于每一段对话,最后一次性pickle.dump写入到文件。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 21:31 | 显示全部楼层
追加有问题呀。

你可以喂给pickle一个txt伪装成的二进制文件,pickle会报错,因为没有pickle的特定标识(叫啥忘了)

pickle机制是你写一次它搞个标识,你直接追加效果当然不好,都是标识,给pickle搞不会了.

你load一次,加上新数据,在dump一次呗

求最佳
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:50 | 显示全部楼层
本帖最后由 jackz007 于 2025-6-10 00:08 编辑

        pickle . dump() 只能一次性向映像文件写入一个完整对象,不可以向同一个映像文件写入多个不同对象。
  1. import pickle

  2. def dump_file(boy , girl , count) :
  3.     pickle_file = open('boy_' + str(count) + '.txt' , 'wb')
  4.     pickle . dump(boy , pickle_file)
  5.     pickle_file . close()
  6.     pickle_file = open('girl_' + str(count) + '.txt' , 'wb')
  7.     pickle . dump(girl , pickle_file)
  8.     pickle_file . close()   

  9. f = open('record2.txt')
  10. count1 = 1
  11. boy , girl = '' , ''
  12. for each_line in f:
  13.     if '======' in each_line:
  14.         dump_file(boy , girl , count1)
  15.         count1 += 1
  16.         boy , girl = '' , ''
  17.     else:
  18.         s = each_line . split(':')
  19.         if s[0] == '小甲鱼':
  20.             boy = boy + s[1]
  21.         else :
  22.             girl = girl + s[1]
  23. dump_file(boy , girl , count1)
  24. f . close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 12:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表