如何用yield读取二进制文件中的多个Python对象?
解决用yield读取pickle二进制文件对象的问题
看起来你遇到的核心问题有几个,我帮你一步步梳理和修正:
首先,你的代码里的明显错误
- 参数拼写错误:函数定义里写的是
loadobject(fillname),但函数内部用的是filename,运行时会直接抛出NameError,这个得先修正。 - 未定义变量:
print(Resultfillwrite)这行里的Resultfillwrite从来没定义过,会报错,建议直接删掉这行。 - 生成器变量名拼写问题:
genaratetest是拼写错误(应该是generatetest),虽然不影响运行,但规范一点更好。
最关键的问题:你的testfile里根本没有写入目标字典!
你提到文件包含两个字典,但你的代码里只做了open("testfile", "ab")——这只是打开文件准备追加写入,但你并没有实际用pickle.dump()把字典序列化进去。空文件或者非pickle格式的文件,用pickle.load()自然读不到任何对象。
修正后的完整流程
第一步:先把两个字典写入到testfile
先执行这段代码,确保文件里有正确的pickle数据:
import pickle import os # 切换到目标目录 os.chdir("C:/Program Files/Sublime Text 3/testpython") # 定义你说的两个字典 di1 = {"c1": 3, "c2": 5, "c3": 13, "c4": 12, 5: 8, 6: 8, 7: 1, 8: 5, 9: 12, 10: 2, 11: 20, 12: 16, 13: 45, 14: 6, 15: 4 } di2 = {1: 3, 2: 5, 3: 13, 4: 12, 5: 8, 6: 8, 7: 1, 8: 5, 9: 12, 10: 2, 11: 20, 12: 16, 13: 45, 14: 6, 15: 4 } # 用pickle把两个字典写入文件 with open("testfile", "wb") as f: pickle.dump(di1, f) pickle.dump(di2, f)
第二步:用修正后的读取代码获取对象
import pickle import os os.chdir("C:/Program Files/Sublime Text 3/testpython") def loadobject(filename): with open(filename, "rb") as test: while True: try: yield pickle.load(test) except EOFError: break # 修正拼写后的生成器变量 generatetest = loadobject("testfile") # 循环逐个输出对象 for testobject in generatetest: print(testobject)
运行这段代码后,你就能看到先输出第一个字典,再输出第二个字典,完全符合你的预期。
额外提醒
- 确保你写入和读取时用的是同一个目录,
os.chdir()的路径要正确。 - 如果之前的
testfile已经存在但不是用pickle写入的,建议先删除它再重新执行写入代码,避免读取时出现异常。
内容的提问来源于stack exchange,提问作者the star
相关产品推荐
相关产品推荐

