2012-11-16 24 views
3

我想遍历一个目录。下面是代码:Python遍历文件系统。奇怪的问题

file_list = [] 
    os.chdir(self.config.Root_Directory_Path()) 
    for root, dirs, files in os.walk("."): 
     file_list.extend(join(root,f) for f in files) 
    file_sorted = sorted(file_list) 
    f = open(self.config.Client_Local_Status(),'wb')   
    for file in file_sorted: 
     print(file + "|" + str(os.path.getmtime(file)) + "\n")    
    f.close() 

首先,我遍历树,然后对其进行排序然后打印出来。但是在遍历时我得到了下面的错误。我很确定文件存在,但无法找出错误的原因。请帮助我找出错误和麻烦的原因。

以下是输出。

输出:

.\Drivers\Intel Drivers\Applications\Software\Applications\Wave_Embassy_Trust_Suite\EMBASSY Security Center\program files\Wave Systems Corp\EMBASSY Security Center\plugins\cpm.scp\webinterface\ru\js\HelpMessages.js|1229488128.0 

.\Drivers\Intel Drivers\Applications\Software\Applications\Wave_Embassy_Trust_Suite\EMBASSY Security Center\program files\Wave Systems Corp\EMBASSY Security Center\plugins\cpm.scp\webinterface\ru\js\Strings.js|1229488128.0 

成功地打印大量文件名后,代码为一个特定的文件,如下所示失败:

错误:

Traceback (most recent call last): 
    File "C:\SyncClientRK\SyncClientRK.py", line 183, in <module> 
    SyncClientRK() 
    File "C:\SyncClientRK\SyncClientRK.py", line 17, in __init__ 
    self.getStatus() 
    File "C:\SyncClientRK\SyncClientRK.py", line 38, in getStatus 
    self.generateLocalStatus() 
    File "C:\SyncClientRK\SyncClientRK.py", line 53, in generateLocalStatus 
    print(file + "|" + str(os.path.getmtime(file)) + "\n") 
    File "C:\Python33\lib\genericpath.py", line 54, in getmtime 
    return os.stat(filename).st_mtime 
FileNotFoundError: [WinError 3] The system cannot find the path specified: '.\\Drivers\\Intel Drivers\\Applications\\Software\\Applications\\Wave_Embassy_Trust_Suite\\EMBASSY Security Center\\program files\\Wave Systems Corp\\EMBASSY Security Center\\plugins\\cpm.scp\\webinterface\\zh-CHS\\AccessingToolkit.htm' 

请注意,该文件在循环中获取并打印,但os.path.getmtime正在抛出一个找不到的错误。无法理解为什么以及如何解决这个问题。

+2

我看到这是一个HTML文件。你有没有尝试在浏览器中打开它,看它是否真的存在?我的猜测是,当你调用'os.walk'时它可能已经存在,并且在你检查修改时间时被删除。 – mbatchkarov

+0

@reseter当然,它是一个HTML文件。我用记事本和浏览器打开它,并在其中看到html内容。它也有一些中国人。但我认为这也没有关系,因为我没有阅读其中的内容。它不会被删除,因为我没有删除它。我可以一直看到文件。遍历之后和遍历之后。请再猜一次吗? – Romaan

+1

你应该明确地捕捉到由于文件消失而导致的错误。 – Alfe

回答

4

这是一个220个字符长的文件名,从本地目录开始。假设本地目录的路径长度超过40个字符,那么您将遇到超过260个字符的Windows旧路径限制。

并非所有在Windows中处理文件的方式都有这个限制,但这可能是这里的问题。如果列表中的文件名更长,那么这显然不是问题,但这是我首先要看的。

参见:可能是文件名http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx#maxpath

+1

之后奇怪的字符东西,这将是我的第二次猜测;-)但真的有260个字符的限制?这是可笑的短(和一个非常奇怪的数字)。除非你在CD或类似的地方。 – Alfe

+2

是的,奇怪的字符也是我的第一个猜测,但在他的示例路径中看不到任何非ascii字符。是的,有260个字符的限制。是的,这是可笑的,但这是Windows!我添加了一个可能是解决方法的链接,我没有自己尝试过。 –

+0

我同意Alfre和Lennart Regebro。给我一下,让我开始计算,并寻找任何特殊字符。谢谢 – Romaan

1

奇怪的字符?很显然os.walk会返回一些你以后不能访问的东西;这不应该发生,但它确实如此。必须是古怪的东西,可能与Windows文件系统,文件名处理等有关。当名称不存在时打印名称,使用repr(file_name),并查看是否可以在里面找到奇怪的字符。更有可能的是别的东西在摆弄,但这是我最好的猜测。