2010-01-12 77 views
0

我看到在解析共享路径一些怪异的行为(在服务器上共享的路径,如\存储\编译)os.listdir等无法共享的Windows路径上(Python的2.5)

我读它包含目录的文本文件我想进一步处理的路径。为了做到这一点,我做如下:

def toWin(path): 
    return path.replace("\\", "\\\\") 

for line in open(fileName): 
    l = toWin(line).strip() 
    if os.path.isdir(l): 
     print l # os.listdir(l) etc.. 

这适用于本地目录,但在共享系统上指定的路径失败。

e.g. 
    E:\Test -- works 
    \\StorageMachine\Test -- fails [internally converts to \\\\StorageMachine\\Test] 
    \\StorageMachine\Test\ -- fails [internally converts to \\\\StorageMachine\\Test\\] 

但是,如果我打开python shell,导入脚本并调用具有相同路径字符串的函数,那么它的工作原理!

看来解析Windows共享路径在两种情况下的行为都不同。

任何意见/建议?

回答

-1

必须将输入转换为正斜杠(unix样式)才能正确解析os。*模块。

改变代码如下

def toUnix(path): 
    return path.replace("\\", "/") 

现在所有模块正确地解析。

+0

你的解释很可能是错误的。 os。*函数完全能够处理包含反斜杠的路径,只要您的操作系统能够解释它们即可。看到我自己的回答你的问题。 – 2010-01-25 16:45:08

0

这可能不是您的实际问题,但您的UNC路径实际上不正确 - 它们应以双反斜杠开始,但内部仅使用单个反斜杠作为分隔线。

我不知道为什么相同的东西会在shell中工作。

更新: 我怀疑发生的事情是,在外壳,您的字符串被shell解释(含更换发生),而在你的代码它被视作看到的第一次 - 基本上,指定shell中的字符串与从输入中读取的字符串不同。为了从shell中获得相同的效果,您需要将它指定为一个原始字符串,并使用r"string"

+0

查看更新。他们开始于\\ Storage ..我不明白你在暗示什么。 – Ketan 2010-01-12 05:43:15

+0

已更新。我怀疑它在shell中起作用,因为shell在输入时正在解释字符串,而从输入文件中读取的值是原始的。 – fencepost 2010-01-12 06:03:33

+0

我正在从文件中读取路径名并需要将其转换为正确的形式。如何使字符串从文件(通过readlines)读取到原始格式,以便os。*可以处理。 – Ketan 2010-01-12 15:34:29

0

根本没有理由“转换”。反斜杠只有在代码中包含在字符串文字中时才被解释,而不是以编程方式从文件中读取。因此,你应该禁用你的转换功能,事情可能会奏效。

+0

此输入来自某个包含Windows路径的人,他们将在\中。所以转换可以确保无论输入什么形式,它都可以工作。 – Ketan 2010-01-23 16:44:21

+0

那又如何?如果你在Windows下,Windows路径可以很好地工作。 – 2010-01-25 16:45:44