2013-02-07 95 views
1

系統:Windows 7上的Python 2.6 64位將UNC路徑轉換爲本地路徑(以及Python中的一般路徑處理)

最近我在Python中做了很多路徑格式化。由於字符串修改總是很危險,所以我開始使用'os.path'模塊以正確的方式進行。

第一個問題是,如果這是處理傳入路徑的正確方法?或者我可以以某種方式優化這個?

sCleanPath = sRawPath.replace('\n', '') 
sCleanPath = sCleanPath.replace('\\', '/') 
sCleanPythonPath = os.path.normpath(sCleanPath) 

現在格式化'sCleanPythonPath'我只使用'os.path'模塊中的函數。這工作非常好,迄今爲止我沒有遇到任何問題。

只有一個例外。我必須改變路徑,以便它們不再指向網絡存儲器,而是指向本地驅動器。開始與'os.path.join()'一起使用'os.path.splitunc()'。

aUncSplit = os.path.splitunc(sCleanPythonUncPath) 
sLocalDrive = os.path.normpath('X:/mount') 
sCleanPythonLocalPath = (os.path.join(sLocalDrive, aUncSplit[1])) 

不幸的是,這並不工作,由於如何絕對路徑使用「os.path.join()」處理的性質。我在網上找到的所有解決方案都是再次使用字符串替換,我想通過使用'os.path'模塊來避免這種替換。我有監督什麼嗎?有沒有其他的,也許有更好的方法來做到這一點?

對此的所有評論都非常歡迎!

+0

你用os.path.join得到了什麼,你想得到什麼?我沒有看到你需要使用正則表達式。 – myusuf3

+0

@ myusuf3:假設'sCleanPythonUncPath'是'// host/mount/folder/file.ext',那麼我想獲得'X:/ mount/folder/file.ext'。不幸的是,'os.path.join()'只返回'/ folder/file.ext',因爲它像絕對路徑一樣處理它。你的意思是什麼正則表達式調用? 'replace()'的調用? –

+0

有時''\''在C:\ Program \ Files'中有效,要小心並始終檢查。 – sotapme

回答

0

你可以通過刪除replace()調用,因爲在Windows normpath()轉換稍微向前優化第一部分斜槓反斜槓:

sCleanPath = sRawPath.replace('\n', '') 
sCleanPythonPath = os.path.normpath(sCleanPath) 

這裏的東西,這將使你的問題的工作的第二部分沒有做一個字符串替換:

sSharedFolder = os.path.relpath(os.path.splitunc(sCleanPythonUncPath)[1], os.sep) 
sLocalDrive = os.path.normpath('X:/mount') # why not hardcode the result? 
sCleanPythonLocalPath = os.path.join(sLocalDrive, sSharedFolder) 
+0

這是一個非常聰明的方法。不幸的是,它在我身邊返回了'sCleanPythonLocalPath'的'X:\ mount \ .. \ testfolder \ version \ file.ext'。我必須多玩一點。 'replace()'調用是爲了處理像'C:\ mount \ folder \ ..'這樣的典型窗口結構的路徑。我只是意識到它不能用於轉義字符組合,您可以在以下示例中看到'C:\ mount \ testfolder \ version \ newfile.ext'。如果我想涵蓋所有的事件,我想我必須去正則表達式。 –

+0

用''\\ host \ mount \ folder \ file.ext''正常工作。確保你有'os.path.relpath()'調用權(它需要傳遞給它的第二個參數)。 – martineau

+0

是的,我以正確的方式使用電話。我只是複製並粘貼你的例子。我發送'\ folder \ file.ext'並返回'.. \ folder \ file.ext'。 –