【问题标题】:open file in "w" mode: IOError: [Errno 2] No such file or directory以“w”模式打开文件:IOError: [Errno 2] No such file or directory
【发布时间】:2011-01-24 23:45:11
【问题描述】:

当我尝试使用以下代码以 write 模式打开文件时:

packetFile = open("%s/%s/%s/%s.mol2" % ("dir", "dir2", "dir3", "some_file"), "w")

给我以下错误:

IOError: [Errno 2] No such file or directory: 'dir/dir2/dir3/some_file.mol2'

如果文件不存在,w 模式应该创建文件,对吗?那么这个错误怎么会发生呢?

【问题讨论】:

    标签: python file-io


    【解决方案1】:

    检查脚本是否对该目录具有写入权限。试试这个:

    chmod a+w dir/dir2/dir3
    

    请注意,这将为该目录上的每个人提供写入权限。

    【讨论】:

    • -1;这不是 OP 错误的可能原因。如果你没有对该目录的写权限,Python 会给你IOError: [Errno 13] Permission denied: 'testdir/foo',而不是No such file or directory 错误。
    【解决方案2】:

    由于您没有“起始”斜线,因此您的 python 脚本正在相对于当前工作目录(而不是文件系统的根目录)查找此文件。另请注意,指向该文件的目录必须存在!

    并且:使用os.path.join 组合路径的元素。

    例如:os.path.join("dir", "dir2", "dir3", "myfile.ext")

    【讨论】:

      【解决方案3】:

      如果包含您尝试打开的文件的目录不存在,即使尝试以w 模式打开文件,您也会看到此错误。

      由于您使用相对路径打开文件,因此您可能对该目录到底是什么感到困惑。尝试快速打印以检查:

      import os
      
      curpath = os.path.abspath(os.curdir)
      packet_file = "%s/%s/%s/%s.mol2" % ("dir", "dir2", "dir3", "some_file")
      print "Current path is: %s" % (curpath)
      print "Trying to open: %s" % (os.path.join(curpath, packet_file))
      
      packetFile = open(packet_file, "w")
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的错误,但在我的情况下,原因是在 Windows 下,路径长度超过了 ~250 个字符。

        【讨论】:

        • 我也发现是windows路径长度问题。
        【解决方案5】:

        在 windows 环境中也发生了类似的问题。解决方案是将“C:”添加到绝对路径。 我的目标是在用户桌面中保存一些文件

        file_path = os.path.join(os.environ["HOMEPATH"], os.path.join("Desktop", 
            "log_file.log_%s_%s" %(
            strftime("%Y_%m_%d", localtime()), "number_1")))
        

        然后我试图打开这个目录来保存 比如

        file_ref = open(file_path, "w")
        

        我添加这个是为了运行

        file_ref = open(("C:\\"+file_path), "w")
        

        【讨论】:

          【解决方案6】:

          如果您尝试将损坏的软链接覆盖到同名文件,也会发生此错误。在这种情况下,删除损坏的软链接,您将能够写入新文件。

          【讨论】:

            【解决方案7】:

            我有同样的问题,但我的根本原因与这里的任何人不同。以为我会分享以防其他人遇到同样的问题。

            就我而言,我不小心把括号放错了“with”行:

            with (open(os.path.join(curpath, unique_name)), 'w') as fw:
            

            给出以下错误(修改为模糊公司详细信息并为清晰起见):

            Traceback (most recent call last):
              File "./crap.py", line 60, in uniquify
                with (open(os.path.join(curpath, unique_name)), 'w') as fw:
            IOError: [Errno 2] No such file or directory: '/<mypath>/bin/python/<filename>'
            

            这些括号将 'w' 放在 with() 函数中,而不是像预期的那样放在 open() 中。我很惊讶它给出了这个 IO 错误,这意味着 open() 调用有问题,这比显然来自 with() 调用更难追踪。

            我不相信这些结果,只是再次修改它以复制,是的,我得到了同样的错误。

            当我将括号切换到正确的版本时:

            with (open(os.path.join(curpath, unique_name), 'w')) as fw:
            

            它按预期工作。

            【讨论】:

            • 您会收到一个 IO 错误,因为问题实际上是在 open() 调用中,因为它没有得到正确的参数。 with 非常好,因为您只是传递了一个元组。需要明确的是:with 不需要括号,因为它不是方法而是语句。当您对多个元素使用括号时,它将被解析为一个元组。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-25
            • 1970-01-01
            • 1970-01-01
            • 2013-07-23
            • 1970-01-01
            相关资源
            最近更新 更多