【问题标题】:FileNotFoundError while writing to a Pickle file写入 Pickle 文件时出现 FileNotFoundError
【发布时间】:2017-07-25 01:08:50
【问题描述】:

我正在获取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。)

【问题讨论】:

  • /data/train/ 在场吗?
  • 是的,它存在
  • 在你的根(/) 目录中有一个data 文件夹,其中有一个train 文件夹?请确保您所指的data 目录不在您的项目目录中,而是在root 目录/ 中。

标签: python pickle


【解决方案1】:

在你的情况下很可能/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://stackoverflow.com/a/12517490/3027854

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,但没有一个答案对我有帮助。 目录在那里,我使用wb,但一次又一次出现同样的问题。

    我希望这可以帮助一些有同样问题的人: 我发现问题在于我有很多文件夹,而且文件名太长(因为我将文件名编成一个字符串,我试图在其中指示该文件的特征) 并且当我尝试手动移动该文件时,我试图转储到的文件夹会引发“文件名对于目标文件夹来说太长”。

    缩短文件名后,问题解决了。

    【讨论】:

      【解决方案3】:

      我在使用相对路径名(和符号链接)编写时遇到了类似的问题。该目录确实存在,但它仍在引发 FileNotFoundError。

      当我切换到使用绝对路径时问题消失了

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

      【讨论】:

        【解决方案4】:

        我必须在 Windows 10 上从 Windows 防御者中获取“受控文件夹访问”。

        其他防病毒/防火墙可能具有相同的效果。

        https://support.microsoft.com/en-us/help/4046851/windows-10-controlled-folder-access-windows-defender-security-center

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:
            • 确保文件路径已经存在。
            • 如果路径很长,请在路径前添加魔术前缀\\?\path = '\\\\?\\C:\\Users...

            【讨论】:

              【解决方案7】:
              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 Notebook 一侧,pickle 文件将位于会话文件夹中。您需要从那里下载。

              【讨论】:

                【解决方案8】:

                我不知道这是否对其他人有帮助,但发生在我身上的是,不知何故,我试图保存的文件名是一个保留关键字,导致保存崩溃。只需在名称中添加另一个字符即可使其正确腌制。您可以使用以下功能提前标记此类错误并避免打地鼠。

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

                【讨论】:

                • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                猜你喜欢
                • 2021-04-11
                • 1970-01-01
                • 1970-01-01
                • 2011-10-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多