【问题标题】:Dump (pickle) in new line Python在新行 Python 中转储(泡菜)
【发布时间】:2020-07-07 10:40:58
【问题描述】:

所以我想使用 Pickle 在二进制文件的新行中写入列表的每个元素,我希望以后也能够访问这些字典。

import pickle    
with open(r'student.dat','w+b') as file: 
for i in [{1:11},{2:22},{3:33},{4:44}]:
    pickle.dump(i,file)
file.seek(0)
print(pickle.load(file))

输出:

{1: 11}

有人可以解释为什么其余的元素没有被转储或建议另一种写在新行中的方法吗? 我正在使用 Python 3

【问题讨论】:

    标签: python file delimiter


    【解决方案1】:

    它们都被转储了,但每个转储都是独立的;要全部加载它们,您需要将它们与 load 调用匹配。

    import pickle    
    with open(r'student.dat','w+b') as file: 
        for i in [{1:11},{2:22},{3:33},{4:44}]:
            pickle.dump(i,file)
    file.seek(0)
    print(pickle.load(file))
    
    
    import pickle    
    with open(r'student.dat','w+b') as file: 
        for i in [{1:11},{2:22},{3:33},{4:44}]:
            pickle.dump(i,file)
    file.seek(0)
    for _ in range(4):
        print(pickle.load(file))
    

    如果您不想执行多次加载,请将它们腌制为单个数据结构(例如,同时将原始 listdicts 全部提取)。

    在这些情况下,您都没有写换行符,也不应该这样做; pickle 是一个二进制协议,这意味着换行符只是另一个具有独立含义的字节,尝试将换行符注入流中会妨碍加载数据,并有可能拆分数据位(如果您实际上在加载时间)。

    【讨论】:

    • 谢谢!您能否推荐一个源来阅读二进制文件(即使是视频也可以),它们到底是什么等,因为我只是一个初学者?
    • @sam:我什至不知道从哪里开始。二进制文件是可用的限制最少的定义;它可以包含任何值的字节。含义取决于您编写它的格式(在本例中为pickle)。关键是,如果您的协议涉及写入 arbitrary 字节(pickle 确实如此),那么尝试插入不属于该格式的 any 字节注定会失败而不采取极端措施(例如,为每个格式化部分添加一个长度前缀,以便您知道何时切换模式)。初学者不应该尝试混合这样的东西。
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2015-08-17
    • 2021-12-16
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多