【问题标题】:Convert UNC path to local path (and general path handling in Python)将 UNC 路径转换为本地路径(以及 Python 中的一般路径处理)
【发布时间】:2013-01-23 10:28:24
【问题描述】:

系统:Windows 7 64 位上的 Python 2.6

最近我在 Python 中做了很多路径格式化。由于字符串修改总是很危险,我开始使用“os.path”模块以正确的方式进行修改。

第一个问题是这是否是处理传入路径的正确方法?或者我可以以某种方式优化它吗?

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

现在,为了格式化“sCleanPythonPath”,我只使用“os.path”模块中的函数。这很好用,到目前为止我还没有遇到任何问题。

只有一个例外。我必须更改路径,以便它们不再指向网络存储,而是指向本地驱动器。开始将 'os.path.splitunc()' 与 'os.path.join()' 结合使用。

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

不幸的是,由于使用“os.path.join()”处理绝对路径的性质,这不起作用。我在网上找到的所有解决方案都再次使用字符串替换,我想通过使用“os.path”模块来避免这种情况。我有监督什么吗?还有其他的,也许是更好的方法来做到这一点?

非常欢迎所有关于此的cmets!

【问题讨论】:

  • 您通过 os.path.join 获得了什么,您希望获得什么?我看不出你需要使用正则表达式做什么。
  • @myusuf3:假设sCleanPythonUncPath//host/mount/folder/file.ext,那么我想得到X:/mount/folder/file.ext。不幸的是os.path.join() 只返回/folder/file.ext,因为它处理它就像一个绝对路径。你的意思是什么正则表达式调用? replace()的来电?
  • 有时\C:\Program\ Files 一样有效,要小心并经常检查。
  • 那么我会用排除转义字符的正则表达式替换反斜杠吗?

标签: python path unc


【解决方案1】:

您可以通过删除 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)

【讨论】:

  • 这是一个非常聪明的方法。不幸的是,它在我这边为sCleanPythonLocalPath 返回X:\mount\..\testfolder\version\file.ext。我必须多玩一点。 replace() 调用旨在处理具有典型窗口结构的路径,例如 C:\mount\folder\..。我刚刚意识到它不适用于转义字符,如您可以在以下示例C:\mount\testfolder\version\newfile.ext 中看到的组合。我想如果我想涵盖所有出现的情况,我必须使用正则表达式。
  • '\\host\mount\folder\file.ext' 对我来说很好。确保您的 os.path.relpath() 调用正确(它需要传递给它的第二个参数)。
  • 是的,我以正确的方式使用调用。我只是复制并粘贴了您的示例。我发送\folder\file.ext 并返回..\folder\file.ext
  • >>> os.path.relpath(r'\folder\file.ext', os.sep) 在我的 Windows 系统上返回 'folder\\file.ext'
  • 您使用的是哪个版本的 Python?使用 2.7.3 我得到和你一样的结果,但是使用 2.6.4 我得到领先的 '..\'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多