2013-02-07 98 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'。 –