2010-01-12 22 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