【问题标题】:python-3.x pickling creates empty filepython-3.x 酸洗创建空文件
【发布时间】:2015-09-25 10:04:59
【问题描述】:

我是 python 新手,试图将一些复杂的数据结构存储/检索到文件中,并且正在尝试酸洗。 但是,下面的示例不断创建一个空白文件(那里没有存储任何内容),并且我在第二步中遇到了错误。我一直在谷歌搜索,只是找到了与我的完全匹配的其他示例——但是,它似乎不起作用。 我可能会错过什么?提前发送!

import pickle

messageToSend = ["Pickle", "this!"]
print("before: \n",messageToSend)

f = open("pickletest.pickle","wb")
pickle.dump(messageToSend,f)
f.close

g = open("pickletest.pickle","rb")
messageReceived = pickle.load(g)
print("after: \n",messageReceived)
g.close

【问题讨论】:

  • 第二步(重新打开文件)给出文件为空的错误

标签: python-3.x pickle


【解决方案1】:

您没有关闭文件。注意你写的是f.close而不是f.close()

在python中处理文件的正确方法是:

with open("pickletest.pickle", "wb") as f:
    pickle.dump(messageToSend, f)

所以它会在with块结束时自动关闭文件,即使在处理过程中出现错误。

给出的其他答案仅适用于某些 Python 实现,因为它依赖于关闭文件的垃圾收集器。这是非常不可靠且容易出错的。在处理需要关闭的任何内容时,请始终使用with

【讨论】:

    【解决方案2】:

    我还不确定为什么,但问题与您分配变量以打开文件有关。不要分配变量,代码可以工作。

    import pickle
    
    messageToSend = ["Pickle", "this!"]
    print("before: \n",messageToSend)
    
    pickle.dump(messageToSend, open("pickletest.pickle","wb"))
    
    messageReceived = pickle.load(open("pickletest.pickle","rb"))
    print("after: \n",messageReceived)
    

    【讨论】:

    • 这很奇怪......但是是的,它有效我也尝试过: with open("pickletest.pickle","wb") as f: pickle.dump(messageToSend, f) with open ("pickletest.pickle","rb") as g: messageReceived = pickle.load(g) 并且它也可以工作......我知道这些是等价的 - 显然不是。有谁知道为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多