python - pickle python 的问题

标签 python python-3.x pickle

我最近使用外部文档和 pickle 制作了一个程序。但是当它尝试使用 pickle 加载文件时,我收到此错误(文件已经存在,但当文件不存在时也会失败):

python3.6 check-graph_amazon.py

a
b
g
URL to follow www.amazon.com
Product to follow Pool_table
h
i
[' www.amazon.com', ' Pool_table', []]
p
Traceback (most recent call last):
  File "check-graph_amazon.py", line 17, in <module>
    tab_simple = pickle.load(doc_simple)
io.UnsupportedOperation: read

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "check-graph_amazon.py", line 42, in <module>
    pickle.dump(tab_simple, 'simple_data.dat')
TypeError: file must have a 'write' attribute

这是代码:

import pickle5 as pickle
#import os

try:
    print("a")
    with open('simple_data.dat', 'rb') as doc_simple:
        print("b")
        tab_simple = pickle.load(doc_simple)
        print("c")
        print(tab_simple)
        print("d")
        URL = tab_simple[0]
        produit_nom = tab_simple[1]
        tous_jours = tab_simple[2]
        print("f")

except :
    print("g")
    URL = str(input("URL to follow"))
    produit_nom = str(input("Product to follow"))

    with open('simple_data.dat', 'wb+') as doc_simple:
        print("h")
        #os.system('chmod +x simple_data.dat') 
        tab_simple = []
        tab_simple.append(URL)
        tab_simple.append(produit_nom)
        tab_simple.append([])
        print(tab_simple)
        print("c'est le 2")
        print("p")
        pickle.dump(tab_simple, 'simple_data.dat')
        print("q")

此处的打印显示执行了哪些行。 os.system 允许在文件上写入,但错误仍然存​​在。

我不明白为什么说该文档没有写入属性,因为我是在写入模式下打开它的。我也不明白第一个错误是无法加载文件。

如果它可以帮助您,此脚本的目标是通过 try 初始化程序。它尝试在 try 部分以阅读模式打开文档,然后设置变量。如果该文档不存在(因为该程序是第一次启动),它将进入 except 部分并创建文档,然后再在其上写入信息。

如果您有更好的方法在程序第一次启动时进行初始化,我希望您能有任何线索,包括更改代码的架构。

提前感谢您,如果代码格式不正确,我们深表歉意,我是这个网站的初学者。

最佳答案

引自the docs for pickle.dump :

pickle.dumps(obj, protocol=None, *, fix_imports=True)

Write a pickled representation of obj to the open file object file. ...

...

The file argument must have a write() method that accepts a single bytes argument. It can thus be an on-disk file opened for binary writing, an io.BytesIO instance, or any other custom object that meets this interface.

因此,您应该向此函数传递一个文件对象,而不是文件名,如下所示:

with open("simple_data.dat", "wb"): as File:
   pickle.dump(tab_simple, File)

是的,在您的情况下,文件已经打开,因此您应该写入doc_simple

关于python - pickle python 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57495771/

相关文章:

python - 从 pymc 中保存的痕迹中绘制图形

python - Django: _meta.get_fields() : include_parents=False : 显示继承自的字段

python - 比较运算符为 | 提供不同的值& 与 and or 相比 - Python

python - Django DB优化过滤器点击ip和1小时差异

python - 如何在存在生成器/协程的情况下检查程序状态?

python - 如何比较元组列表?

python - Pygame - 在给定区域随机生成对象

django - 如何序列化二进制文件以用于 celery 任务

python - 分别改变并行进程中的不同python对象

python - 如何在 numpy ndarray 中找到最频繁的字符串元素?