os.listdir无法看到我的目录。

5
我正在编写一个Python脚本,用于在Windows 8.1机器上安装802.1x证书。该脚本在Windows 8和Windows XP上运行良好(尚未在其他机器上尝试)。
我已经找到了问题所在。它与清除文件夹有关。
"C:\Windows\system32\config\systemprofile\AppData\LocalLow\Microsoft\CryptURLCache\Content"

问题在于我正在使用模块 os 和命令 listdir 来删除文件夹中的每个文件。然而,listdir 出现错误,说该文件夹不存在,但实际上它是存在的。

问题似乎是因为 os.listdir 无法看到 LocalLow 文件夹。如果我编写一个两行的脚本:

import os

os.listdir("C:\Windows\System32\config\systemprofile\AppData") 

它显示以下结果:
['Local', 'Roaming']

正如您所看到的,LocalLow消失了。
我认为这可能是权限问题,但我很难找出下一步该怎么办。我从命令行以管理员身份运行该进程,但它根本看不到该文件夹。
提前感谢您!
编辑:将字符串更改为r“C:\ Windows \ System32 \ config \ systemprofile \ AppData”,“C:\ Windows \ System32 \ config \ systemprofile \ AppData”或C:/ Windows / System32 / config / systemprofile / AppData”都会产生相同的结果
编辑:此问题的另一个不寻常之处:如果我在该位置手动创建新目录,则无法通过os.listdir查看它。此外,我无法通过Notepad ++中的“另存为...”命令浏览到LocalLow或我的New Folder。
我开始想这可能是Windows 8.1预览版中的一个错误。

2
你说“...当它确实存在时。”,但你展示的证据似乎表明它不存在。你为什么认为它确实存在? - twalberg
如果你启动了 cmd 或 Powershell 并尝试列出 AppData 目录的内容,你能看到 LocalLow 吗?另外,也许你可以尝试使用 os.walk(directory) 命令来看看是否得到相同的结果? - Jeff B
是的,无论是使用"ls"命令还是直接浏览到该文件夹,我都可以看到它。我也可以从cmd提示符中进入它。 - Jason Bray
3个回答

9
我最近遇到了这个问题。
我发现它是由Windows文件系统重定向引起的。
你可以查看以下Python代码片段。
import ctypes

class disable_file_system_redirection:
    _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
    _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection
    def __enter__(self):
        self.old_value = ctypes.c_long()
        self.success = self._disable(ctypes.byref(self.old_value))
    def __exit__(self, type, value, traceback):
        if self.success:
            self._revert(self.old_value)


#Example usage
import os

path = 'C:\\Windows\\System32\\config\\systemprofile\\AppData'

print os.listdir(path)
with disable_file_system_redirection():
    print os.listdir(path)
print os.listdir(path)

参考:http://code.activestate.com/recipes/578035-disable-file-system-redirector/


嘿,谢谢你的回答。这看起来不错,但不幸的是,我已经不在我曾经使用Python的工作岗位上了,所以我无法确认这是否有效。如果有其他人可以确认它,我很乐意将其标记为答案。 - Jason Bray
@JasonBray 曾为我效力,但如果您正在运行 Python 3.x+,则需要使用 print(os.listdir(path)) 而不是 print os.listdir(path) - Chris Sprague
我希望我能给这个更多的赞。我花了几个小时在这个问题上苦思冥想,因为在C:\Windows\System32中新创建的目录在Python看来似乎不存在。@JasonBray - 这个解决方案可行,应该被标记为答案。向adamLee致敬。 - PeterByte

5

您的路径中必须包含转义序列。对于文件/目录路径,建议使用原始字符串:

# By putting the 'r' at the start, I make this string a raw string
# Raw strings do not process escape sequences
r"C:\path\to\file"

或者将反斜杠换成正斜杠:

"C:/path/to/file"

或者转义斜杠:

# You probably won't want this method because it makes your paths huge
# I just listed it because it *does* work
"C:\\path\\to\\file"

1
另一种选择是在路径中使用双反斜杠(即'\'而不是'')。 - Jeff B
2
@JeffBridgman - 当你发表评论时,我正在输入那个。 :) - user2555451
感谢您的快速回复!然而,所有三个选项生成的结果与我的原始脚本完全相同。 - Jason Bray
好的,我已经构建了一个解决方法,通过启动一个子进程来运行一个批处理文件来删除它们。我不确定,但可能与为每个文件夹修改文件属性有关,这也可能是为什么os模块无法看到该文件夹的原因。 - Jason Bray
@iCodez 在前两个路径中,您没有使用闭合的 ", 这不是必需的吗?还是只是打错字了?我对 Python 不是非常熟悉。 - Jeff B
@JeffBridgman - 不,那些实际上是打错了。谢谢你指出来。 - user2555451

1

我很好奇您是如何使用这两行代码列出内容的。您在代码中使用了转义序列\W、\S、\c、\s、\A。请尝试像这样转义反斜杠:

import os
os.listdir('C:\\Windows\\System32\\config\\systemprofile\\AppData')

我不确定为什么它们没有被解释为转义序列,但是上面提出的所有三个建议以及原始代码都完全相同。 - Jason Bray

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