python-3.x pickling创建空文件

python-3.x pickling创建空文件,python-3.x,pickle,Python 3.x,Pickle,我是python新手,尝试将一些复杂的数据结构存储/检索到文件中,并且正在尝试酸洗。 然而,下面的示例一直在创建一个空白文件(没有存储任何内容),我在第二步遇到了一个错误。我一直在谷歌上搜索,结果发现其他的例子和我的完全匹配——然而,它似乎不起作用。 我会错过什么?提前发送 import pickle messageToSend = ["Pickle", "this!"] print("before: \n",messageToSend) f = open("pickletest.pickl

我是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

我还不知道为什么,但问题与分配变量以打开文件有关。不要分配变量,代码就会工作

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)

您没有关闭这些文件。注意,您编写了
f.close
而不是
f.close()

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

with open("pickletest.pickle", "wb") as f:
    pickle.dump(messageToSend, f)
因此,即使在处理过程中出现错误,当
with
块结束时,它也会自动关闭文件


给出的另一个答案仅在某些Python实现中有效,因为它依赖于垃圾收集器关闭文件。这是非常不可靠和容易出错的。处理任何需要关闭的文件时,请始终将
一起使用。

第二步(重新打开文件)会出现文件为空的错误,这很奇怪。。。但是是的,它可以工作,我也尝试过:用open(“pickletest.pickle”,“wb”)作为f:pickle.dump(messageToSend,f)用open(“pickletest.pickle”,“rb”)作为g:messageReceived=pickle.load(g),它也可以工作。。。我知道这些是等价的——显然不是。有人知道为什么吗?