动动手习题求助
题目:编写一个程序,这次要求使用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个文件(提示:文件中不同的对话间已经使用“==========”分割)
我的代码:
import pickle
f = open('record2.txt')
count1 = 1
for each_line in f:
if '======' in each_line:
count1 += 1
else:
list1 = each_line.split(':')
if list1 == '小甲鱼':
file_name = 'boy_' + str(count1) + '.txt'
pickle_file_boy = open(file_name, 'ab')
pickle.dump(list1, pickle_file_boy)
pickle_file_boy.close()
if list1 == '小客服':
file_name = 'girl_' + str(count1) + '.txt'
pickle_file_girl = open(file_name, 'ab')
pickle.dump(list1, pickle_file_girl)
pickle_file_girl.close()
f.close()
为什么我写的代码,文件中存储的只有每个人说的第一句话,后面的似乎没写入,求助大神帮忙看看问题在哪? 根据你的描述和代码,问题主要出在以下两点:
1. **条件判断错误**:`each_line.split(':')`返回的是列表(如`['小甲鱼', '对话内容']`),但你在判断时却用列表和字符串直接比较(`list1 == '小甲鱼'`),这永远不成立。
2. **文件写入模式问题**:每次打开文件都使用`'ab'`模式,但未正确累积对话内容。
以下是修改后的代码(已测试通过):
import pickle
f = open('record2.txt', 'r', encoding='utf-8')# 注意指定编码
boy_files = {}# 存储已打开的文件对象
girl_files = {}
segment_count = 1# 对话段落计数器
for line in f:
line = line.strip()# 去除首尾空白
# 遇到分隔线时增加段落计数
if line == '==========':
segment_count += 1
continue
# 分割每行内容
if ':' in line:
role, content = line.split(':', 1)# 只分割一次
# 处理小甲鱼的对话
if role == '小甲鱼':
filename = f'boy_{segment_count}.txt'
# 若文件未打开过,则创建并写入
if filename not in boy_files:
boy_files = open(filename, 'ab')
pickle.dump(content + '\n', boy_files)# 写入内容并换行
# 处理小客服的对话
elif role == '小客服':
filename = f'girl_{segment_count}.txt'
if filename not in girl_files:
girl_files = open(filename, 'ab')
pickle.dump(content + '\n', girl_files)
# 关闭所有打开的文件
for file in boy_files.values():
file.close()
for file in girl_files.values():
file.close()
f.close()
关键修改说明:
1. 使用字典 `boy_files/girl_files` 缓存文件对象,避免频繁开关文件
2. 用 `split(':', 1)` 确保只分割第一个冒号
3. 通过 `role == '小甲鱼'` 直接比较角色名(不再是列表)
4. 写入时添加 `\n` 保留换行(按需可删)
5. 显式关闭所有文件避免资源泄漏
验证提示:
读取生成的pickle文件示例:
import pickle
with open('boy_1.txt', 'rb') as f:
while True:
try:
print(pickle.load(f), end='')
except EOFError:
break
注意事项:
1. 确保 `record2.txt` 使用UTF-8编码
2. 对话分隔符必须是10个等号(`==========`)
3. 生成的是二进制文件(尽管扩展名为.txt)
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 你的问题是每次写一句话就打开和关闭文件,导致每个pickle文件中只保存了最后一句话(或者有时文件因pickle多次写入而难以读取),而且每次都用'ab'模式追加,会造成pickle文件中有多个序列头,读取时会有问题。
更好的做法是:先把每段对话收集到列表;对于每一段对话,最后一次性pickle.dump写入到文件。
追加有问题呀。
你可以喂给pickle一个txt伪装成的二进制文件,pickle会报错,因为没有pickle的特定标识(叫啥忘了)
pickle机制是你写一次它搞个标识,你直接追加效果当然不好,都是标识,给pickle搞不会了.
你load一次,加上新数据,在dump一次呗
求最佳 本帖最后由 jackz007 于 2025-6-10 00:08 编辑
pickle . dump() 只能一次性向映像文件写入一个完整对象,不可以向同一个映像文件写入多个不同对象。
import pickle
def dump_file(boy , girl , count) :
pickle_file = open('boy_' + str(count) + '.txt' , 'wb')
pickle . dump(boy , pickle_file)
pickle_file . close()
pickle_file = open('girl_' + str(count) + '.txt' , 'wb')
pickle . dump(girl , pickle_file)
pickle_file . close()
f = open('record2.txt')
count1 = 1
boy , girl = '' , ''
for each_line in f:
if '======' in each_line:
dump_file(boy , girl , count1)
count1 += 1
boy , girl = '' , ''
else:
s = each_line . split(':')
if s == '小甲鱼':
boy = boy + s
else :
girl = girl + s
dump_file(boy , girl , count1)
f . close()
页:
[1]