【问题标题】:OSError: [Errno 22] Invalid Argument with PickleOSError:[Errno 22] Pickle 参数无效
【发布时间】:2021-06-16 02:46:02
【问题描述】:

我编写了一个小程序,它每小时将一个小字典腌制到一个文件中,启动一次。我使用的是 pickle.dump,最初是在我的 macbook 笔记本电脑上使用的。在那里,我指定了我想要的文件名,程序刚刚创建了文件以将数据转储到其中。 但是,完全相同的代码在我的 PC 上完成,我得到了标题错误。我以为是因为 PC 上的路径不同,所以我尝试执行“C:/..../playerdata/filename”而不是“./playerdata/filename”,但无济于事。

这是代码块:

def write_data(self,master_table,label,num):
  filename = './playerdata/'+str(master_table["num"])+' - '+label+' - data'
  with open(filename,"wb") as file:
    pickle.dump(master_table,file,protocol=pickle.HIGHEST_PROTOCOL)
  #masterlist[num] = [filename,label] #doesn't really matter for the problem

我假设错误正在发生,因为没有名为该文件的文件,但是当我在我的 mac 上运行它时,它只是创建了它。我相信pickle会这样做,但是代码永远不会有机会转储它,因为它需要先打开。

我是否缺少某种格式?如何让创建的文件不出错?

【问题讨论】:

  • Windows 上的文件名中不允许使用某些内容。您要写入的最终文件名是什么? (如果你是print(filename)?)
  • @AKX 类似 "0-Hour 0/00/00.067415 - data" 那里有什么不允许的吗?
  • 是的。不允许使用斜线。

标签: python pickle


【解决方案1】:

如果您的文件名可以包含斜杠(如您所知,它分隔目录),您需要确保中间目录也存在。这很容易通过os.makedirs() 一口气完成。

为简洁起见,我还将其更改为使用 f-strings (Python 3.6+) 生成文件名。

def write_data(self, master_table, label, num):
    filename = f'./playerdata/{master_table["num"]} - {label} - data'
    os.makedirs(os.dirname(filename), exist_ok=True)  # <- New
    with open(filename, "wb") as file:
        pickle.dump(master_table, file, protocol=pickle.HIGHEST_PROTOCOL)

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2017-04-10
    • 2021-02-10
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多