写入Pickle文件时出现FileNotFoundError错误

24

我正在将某个目录中的所有文件名存储在一个list中,并希望将此列表写入一个pickle文件。以下是我使用的代码:

import _pickle as pickle
with open(filepath+'filenames.pkl', 'wb') as f:
    pickle.dump(filenames, f)

这给我带来了以下错误:
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-32-c59e6889d2fe> in <module>()
      1 import _pickle as pickle
----> 2 with open(dpath+'filenames.pkl', 'wb') as f:
      3     pickle.dump(filenames, f)

FileNotFoundError: [Errno 2] No such file or directory: '/data/train/filenames.pkl'

我应该创建这个文件。为什么这个文件已经被期望了?

(我正在使用Python 3.6。)


2
/data/train/ 是否存在? - Vikash Singh
是的,它存在。 - Patthebug
2
你的根目录(/)下有一个名为data的文件夹,其中包含一个名为train的文件夹。请务必确保你所指的data目录不在你的项目目录中,而是在root目录下。 - Vikash Singh
8个回答

19
在您的情况下,最有可能是/data/train/目录不存在。
我尝试了这段代码并得到了相同的错误:
import pickle as pickle
filenames='sadasdas'
with open('/tmp/not_exist/filenames.pkl', 'wb') as f:
    pickle.dump(filenames, f)

输出:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-7-6a22c2148796> in <module>()
      1 import pickle as pickle
      2 filenames='sadasdas'
----> 3 with open('/tmp/not_exist/filenames.pkl', 'wb') as f:
      4     pickle.dump(filenames, f)

FileNotFoundError: [Errno 2] No such file or directory: '/tmp/not_exist/filenames.pkl'

在写入文件之前,您可以通过确保目录存在来解决此问题:实现此操作的编程方法如下所示

import os
filename = "/tmp/not_exist/filenames.pkl"
os.makedirs(os.path.dirname(filename), exist_ok=True)
data = 'sadasdas'
with open('/tmp/not_exist/filenames.pkl', 'wb') as f:
    pickle.dump(data, f)

参考:https://dev59.com/F2cs5IYBdhLWcg3w3Hun#12517490


7
我也遇到了同样的问题,但是所有的答案都没有帮助我解决。这些目录都存在且我使用了wb,但是问题一次又一次地出现。
我希望这能帮助遇到同样问题的人:
我发现问题是由于我有很多文件夹,同时文件名太长(因为我将文件名编写为字符串,其中我试图表明该文件的特性),并且我试图转储到的文件夹会在我尝试手动移动该文件时引发“文件名对目标文件夹来说太长”的错误。
缩短文件名后,问题得到了解决。

1
除了文件长度之外,我遇到的另一个问题是我的名称中含有“/”字符。这可能是要注意的另一项内容。 - Josh W

3

在使用相对路径名(和符号链接)写作时,我遇到了类似的问题。该目录明确存在,但仍然会引发“FileNotFoundError”错误。

当我改用绝对路径时,问题消失了。

abspath = pathlib.Path(filename).absolute()
with open(str(abspath), 'wb') as f:
    pickle.dump(thing_to_pickle, f)

1

0

请确保您使用的filepath实际上存在于您的计算机中。有时我们从其他地方复制和粘贴代码,忘记更改驱动器名称。您可能正在寻址不存在的驱动器。


0

我不知道这是否会帮助其他人,但对我来说,问题在于我尝试保存的文件名是一个保留关键字,这导致了保存失败。只需在名称中添加另一个字符即可使其正确保存。以下是一个函数,您可以使用它提前标记此类错误,避免玩打地鼠游戏。

https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.is_reserved


2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
  • 确保文件路径已经存在。
  • 如果路径非常长,请在路径前添加神奇的前缀\\?\path = '\\\\?\\C:\\Users...

0
import os
import sys
import pickle

filenamelst = ['a.txt','b.py','c.ipynb']
filenamelst_abspathname = os.path.abspath('filenamelst.pickle')
print(filenamelst_abspathname)
picklefile = open(str(filenamelst_abspathname),'wb')
pickle.dump(filenamelst, picklefile)
picklefile.close()

这个可以用。在你的Google Colab笔记本电脑的侧边栏中,pickle文件将出现在会话文件夹中。你需要从那里下载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接