Python的os.path.exists()无法定位文件,但该文件确实存在。

5

这是我的代码,它可以定位文件ctfmon.exe,但无法定位文件cc.dll

   >>> import os
   >>> os.path.exists("c:\\windows\\system32\\ctfmon.exe")
   True
   >>> os.path.exists("c:\\windows\\system32\\cc.dll")
   False

然而,文件cc.dll确实存在。

C:\Windows\System32>dir cc.dll
 驱动器 C 中的卷没有标签。
 卷的序列号是 B481-54FB

 C:\Windows\System32 的目录

2014/04/17  14:12                 0 cc.dll
           1 个文件              0 字节
           0 个目录  8,659,787,776 可用字节

2
Windows不区分大小写吗? - Tim
导入 os print os.path.exists("c:\windows\system32\cca.dll") - sundar nataraj
那个 cc.dll 目录显示的文件大小是零字节吗? - jussij
2
尝试使用os.listdir(https://docs.python.org/2/library/os.html#os.listdir)列出“c:\\ windows \ system32 \”中的所有文件,也许它会以不同的名称出现,或者您的程序没有权限查看该文件。 - Luc DUZAN
@TimCastelijns 不,不是这样的。 - Adam Smith
显示剩余2条评论
3个回答

4

你正在64位的Windows上运行32位版本的Python。当你在64位Windows中启动32位应用程序时,C:\Windows\SysWOW64映射到C:\Windows\System32。


1
这是正确的答案,应该被接受。使用 ctypesWow64DisableWow64FsRedirection 来禁用此映射(https://mail.python.org/pipermail/python-win32/2009-June/009263.html)。 - toriningen

1
尝试这个例子:

os.path.isfile("your address/your file")

这是来自Python文档的内容:

os.path.exists(path) 如果path指向一个已存在的路径,则返回True。对于损坏的符号链接,返回False。在某些平台上,即使该路径实际存在,但如果没有被授予执行os.stat()请求文件的权限,此函数可能会返回False。也许这就是你的问题所在。


谢谢您的帮助。但我刚刚尝试了os.path.isfile,它仍然返回false。当我尝试同一目录中的其他dll文件时,它成功了。 - marsen
@marsen 我相信 os.path.isfile 在某种程度上扩展了 os.path.exists :) 那不是一个明确的测试。 - Adam Smith
@maersen 通过使用os.path.getsize(path)检查目录的大小,以确定Python是否能够识别该dll文件。 - Alireza Sanaee
@marsen 请查看这个问题(https://dev59.com/IFfas4cB2Jgan1znTVMV) - Alireza Sanaee
我已经尝试了文件大小,但没有找到相同大小的文件。但我发现一个可疑的文件,它有类似的名称但大小不同。我无法在命令提示符中找到该文件。 - marsen
@marsen,你有没有检查那个问题? - Alireza Sanaee

-1

尝试去掉双斜杠..

import os
print os.path.exists("c:\\windows\system32\cca.dll")

或者

print os.path.exists("""c:\\windows\system32\cca.dll""")

那样做不行,因为你会有可迭代的 c、冒号 :、反斜杠 \\、Windows \system32 等等。 - Adam Smith
那么你要么输入了 r"C:\windows\system32\cca.dll",要么输入了 "C:/Windows/system32/cca.dll" - Adam Smith
print os.path.exists("""c:\windows\system32\cc.dll""") 这个也可以。 - sundar nataraj
如果我想动态地检查来自文件的许多文件,该怎么办? - sundar nataraj
2
你说得对,在这个例子中它可以工作,因为\w\s\c都不是转义字符。但如果你要查找“C:\windows\system32\nslookup.exe”就麻烦了 :) - Adam Smith
显示剩余3条评论

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