Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中同时以读写方式打开pickle文件?_Python_Python 3.x_Pickle - Fatal编程技术网

如何在python中同时以读写方式打开pickle文件?

如何在python中同时以读写方式打开pickle文件?,python,python-3.x,pickle,Python,Python 3.x,Pickle,如何在python中同时以读写方式打开pickle文件? 有没有办法做到这一点,或者这是不可能的。不可能 为此,打开两个文件指针,一个用于读取,另一个用于写入。 对于写入指针,请将其命名为“file.tmp”或其他名称。写入此文件后,可以使用新的file.tmp文件替换另一个文件。Psuedocode是: f1 = open('hello.txt', 'r') f2 = open('hello.txt.tmp', 'w') f1_contents = f1.read() # do someth

如何在python中同时以读写方式打开pickle文件? 有没有办法做到这一点,或者这是不可能的。

不可能

为此,打开两个文件指针,一个用于读取,另一个用于写入。 对于写入指针,请将其命名为“file.tmp”或其他名称。写入此文件后,可以使用新的
file.tmp
文件替换另一个文件。Psuedocode是:

f1 = open('hello.txt', 'r')
f2 = open('hello.txt.tmp', 'w')

f1_contents = f1.read()
# do something with f1_contents
f2.write(f1_contents)

f1.close(); f2.close()

import os
os.rename('hello.txt.tmp', 'hello.txt')

你应该更多地了解你想要实现的目标

要正确读取包含多个对象的pickle文件是很困难的——您必须保留一个在对象的开始和结束处都有索引的边结构


总而言之,使用sqlite3、使用它创建数据库文件、使用一个表(将其命名为“pickles”)更容易,该表可能只包含两列:一个用于pickle对象的id和序列化对象本身

我不赞成使用这样的代码,相反,我建议您用您试图解决的实际问题更新问题,而不是在读写模式下打开pickle对象。在try和except中包装它的原因是第一次运行时pickle文件不存在,因此我们将创建它

导入pickle
尝试:
打开(“my_pickle.file”、“rb+”)作为pickle_文件:
mylist=pickle.load(pickle\u文件)
mylist=[i*2表示mylist中的i]
pickle_file.seek(0)
pickle.dump(mylist,pickle\u文件)
打印(mylist)
除FileNotFoundError作为fnfe外:
打开(“my_pickle.file”、“wb”)作为pickle_文件:
pickle.dump([1,2,3],pickle\u文件)
运行此脚本5次,第一次创建pickle对象,接下来4次将使列表中的值加倍

输出

[1,2,3]
[2, 4, 6]
[4, 8, 12]
[8, 16, 24]
[16, 32, 48]

但我还是不推荐这样做。相反,如果你用你的实际代码和问题更新你的问题,可能有更好的方法来解决这个问题,并获得一些其他答案。

一个问题是,你为什么要这样做?这样我就不需要在阅读文件时更改代码了。因为你不发布代码,所以很难给出任何真正的建议,但有些东西闻起来你的方法不对。老兄,我的代码还不完整,所以我没发。我知道它闻起来不对,哈哈。我用了一种非传统的方法,这就是它闻起来不对的原因。这是可能的。我不能说这是我做这样一项任务的首选方式,但这肯定是可能的。@ChrisDoyle,现在我想起来了,是的,但维护文件指针/缓冲区状态很麻烦。让我想起我在大学里的C++天,我发布了一个答案,但再次敦促OP发布真正的问题,因为有一种更清洁的方式来完成这个。好代码。如果由我决定,我将使用文件交换并完成。我完全同意。我更希望有一个用于读取的文件句柄,并在加载pickle对象后将其关闭,然后打开一个用于回写同一文件的文件句柄。迪福在这个问题上有些不对劲,我相信如果我们看到操作代码或实际问题,我们会给出一个更好的方法