没有这样的文件或目录错误

7
这是我遇到的错误:

Traceback (most recent call last):
  File "E:\stuff\module.py", line 91, in <module>
    f = open('E:/stuff/log.txt')
IOError: [Errno 2] No such file or directory: 'E:/stuff/log.txt'

这是我的代码:

f = open('E:/stuff/log.txt')

E:/stuff/log.txt文件已存在。我可以在Windows资源管理器中导航并打开它,那么为什么我不能打开它?

编辑:

DIR命令的输出:

C:\Documents and Settings\Administrator>dir e:\stuff
 Volume in drive E has no label.
 Volume Serial Number is 5660-4957

 Directory of e:\stuff

23. 10. 2010  09:26    <DIR>          .
23. 10. 2010  09:26    <DIR>          ..
19. 10. 2010  20:07               385 index.py
23. 10. 2010  16:12             1 954 module.py
22. 10. 2010  19:16             8 335 backprop.py
19. 10. 2010  20:54             1 307 backprop-input.gif
19. 10. 2010  01:48               310 HelloWorld.kpf
23. 10. 2010  15:47                 0 log.txt.txt
               6 File(s)         12 291 bytes
               2 Dir(s)   8 795 586 560 bytes free



C:\Documents and Settings\Administrator>dir e:\
 Volume in drive E has no label.
 Volume Serial Number is 5660-4957

 Directory of e:\

16. 10. 2010  13:32    <DIR>          development-tools
23. 10. 2010  09:26    <DIR>          stuff
               0 File(s)              0 bytes
               2 Dir(s)   8 795 586 560 bytes free

我正在通过cmd运行python脚本,命令如下:

python E:\stuff\module.py

@S. Lott 我已经做了。请看我更新的问题。 - Richard Knop
1
@Richard:那不是命令提示符,那是Python解释器。 - SilentGhost
抱歉,我刚刚发布了从cmd中的“dir”命令的输出。我添加了“dir e:\”和“dir e:\stuff”的输出。 - Richard Knop
2
log.txt.txtlog.txt不一样,是吗? - SilentGhost
1
@Richard:这并不值得。接受Tim的答案或者删掉这个问题。对于社区来说意义不大。 - SilentGhost
显示剩余4条评论
8个回答

13

首先,从上面开始,Windows很好地支持了“/”。

其次: 如果您查看您的文件,您会注意到它不是log.txt,而是log.txt.txt......您可能会在图形文件夹查看器中将其视为“log.txt”(与CLI“dir”命令相反),只是因为它隐藏了已知的文件扩展名。

我建议您禁用此功能-请参见文件夹选项,应该有一个“隐藏已知文件类型的扩展名”(或类似)选项。


4

请看"dir"输出中的这一行:

23. 10. 2010  15:47                 0 log.txt.txt

您要查找的文件名为"log.txt.txt",而不是"log.txt"。我发现当人们设置Windows文件管理器不显示已知文件扩展名时,他们尝试添加或修改扩展名时会出现这种情况。我建议其他人关闭此行为。您可以在"视图->文件夹选项"下执行此操作。

1
只是提一下:人们通常不会这样“设置”,这(可悲的是)是默认行为。在我看来,这是一个可怕、可怕的想法,但可悲的是,事实就是如此。 - Tim Čas

1

由于这是Windows系统,反斜杠是转义字符,因此您必须将反斜杠加倍以进行转义。请尝试:

e:\\stuff\\log.txt

为什么不使用r"e:\stuff\log.txt"?为什么不使用os.path.join("E:","stuff","log.txt") - S.Lott
OP正在使用正斜杠 - 转义在这里 不是 问题。正如Brady和Tim所指出的那样,log.txt文件不存在,它应该是log.txt.txt - paxdiablo

1

我已经很久没有使用Windows了,但如果我记得正确的话,Windows在系统路径中使用反斜杠,因此你应该这样做:

import os

file_name = os.path.join("e:\\stuff", "log.txt")

f = open(file_name)

而不是:

f = open('E:/stuff/log.txt')

在 Windows 中路径中没有 /。


Python 实际上可以很好地处理正斜杠 - 我不知道你使用它的时间有多久,但它可能在你使用它时无法处理。 :-) - paxdiablo
@paxdiablo:对不起?我没听懂,我说的是Windows在路径中不使用反斜杠,就像Unix一样。我什么时候说Python不能处理正斜杠了? - mouad
你说不要使用 f = open('E:/stuff/log.txt'),但实际上这样做是可以的。你不需要反斜杠。 - paxdiablo
@paxdiablo:如果我错了,请纠正我,但我认为Windows没有像这样的路径__E:/stuff/log.txt__,没有正斜杠,它们使用反斜杠,就像这样:__E:\stuff\log.txt__,你看到了区别 :) - mouad
1
是的,我看到了区别,但Windows本身会根据http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#paths处理此问题:“注意,Windows API中的文件I/O函数将“/”转换为“\”作为将名称转换为NT样式名称的一部分,除非在使用以下各节中详细说明的“\?\”前缀时。”您可以在问题中看到这一点。代码使用正斜杠,但错误消息使用反斜杠。 - paxdiablo
@paxdiablo:啊,好的,非常感谢您提供的信息。就像我说的,我已经很久没有使用Windows了: ),所以Windows会规范化路径而无需调用:os.path.normpath(),哈哈!! - mouad

1

使用os.path.join()定义您的路径名称

root="E:\\"
mylog = os.path.join(root,"stuff","log.txt") # or log.txt.txt as seen in your dir output
f = open(mylog)
...
f.close()

1

阅读权限怎么样?也许没有授权读取(默认的打开模式)


1

只需使用绝对路径的原始字符串

file_path = r"E:\stuff\log.txt"

这应该工作得很好


0

以下方法适用于我。不要使用Environment.getExternalStorageDirectory(),而是使用context.getFilesDir()
以下代码片段适用于我。

public void create_file(Context context, String sFileName, String sBody) {
        try {
            File root = new File(context.getFilesDir(), "NEC_TEXT");
            if (!root.exists()) {
                root.mkdir();
            }
            File filepath = new File(root, sFileName);
            FileWriter writer = new FileWriter(filepath);
            writer.append(sBody);
            writer.flush();
            writer.close();
            Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(context, "Error"+e.toString(), Toast.LENGTH_SHORT).show();
            e.printStackTrace();



           }
}

目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
这个答案似乎是针对不同的问题和不同的编程语言编写的。 - Jason Harrison

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