You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:12:44