以“w”模式打开文件:IOError:[Errno 2]没有这样的文件或目录

时间:2010-03-08 13:39:04

标签: python file-io

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

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”模式应该创建文件,对吗?那么这个错误怎么会发生呢?

7 个答案:

答案 0 :(得分:42)

如果包含您尝试打开的文件的目录不存在,即使尝试以“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")

答案 1 :(得分:15)

由于你没有'starting'斜杠,你的python脚本正在查找相对于当前工作目录的文件(而不是文件系统的根目录)。另请注意,导致该文件的目录必须存在!

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

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

答案 2 :(得分:7)

我遇到了同样的错误,但就我而言,在Windows下,原因是路径超过~250个字符。

答案 3 :(得分:0)

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

chmod a+w dir/dir2/dir3

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

答案 4 :(得分:0)

Similar issue happened in windows environment. Solution was to add "C:" to absolute path. My goal was to save some files in user Desktop

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

then I was trying to open this directory to save such as

file_ref = open(file_path, "w")

I added this in order to run

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

答案 5 :(得分:0)

如果您尝试覆盖断开的具有相同名称的文件的软链接,也会发生此错误。在这种情况下,删除断开的软链接,就可以编写新文件。

答案 6 :(得分:0)

我遇到了同样的问题,但根本原因与任何人都不一样。以为我愿意与别人分享同一问题。

就我而言,我不小心将括号放在了“ 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:

它按预期工作。