OSError: [Errno 22] Invalid Argument with Pickle
OSError: [Errno 22] Invalid Argument with Pickle
我写了一个小程序,每小时将一个小字典腌制到一个文件中,一次是在启动时。我正在使用 pickle.dump,我最初是在我的 macbook 笔记本电脑上使用的。在那里,我指定了我想要的文件名,程序刚刚创建了文件来将数据转储到其中。
然而,完全相同的代码在我的电脑上完成,我得到了标题错误。我认为这是因为 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 可以做到这一点,但是代码从来没有机会转储它,因为它需要先打开。
我是不是漏掉了某种格式?如何让文件创建无误?
如果您的文件名可以包含斜线(如您所知,它们分隔目录),您需要确保中间目录也存在。 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)
我写了一个小程序,每小时将一个小字典腌制到一个文件中,一次是在启动时。我正在使用 pickle.dump,我最初是在我的 macbook 笔记本电脑上使用的。在那里,我指定了我想要的文件名,程序刚刚创建了文件来将数据转储到其中。 然而,完全相同的代码在我的电脑上完成,我得到了标题错误。我认为这是因为 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 可以做到这一点,但是代码从来没有机会转储它,因为它需要先打开。
我是不是漏掉了某种格式?如何让文件创建无误?
如果您的文件名可以包含斜线(如您所知,它们分隔目录),您需要确保中间目录也存在。 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)