为什么在 Windows、python3、os.path.abspath 上,如果它只是一个目录或更多目录,则不会以相同的方式处理前导斜杠?
Why on Windows, python3, os.path.abspath doesn't deal with leading slashes the same way if it's just a dir or if it's more?
在 Windows,python3:
>>> print(os.path.abspath("//foo/foo.txt"))
\foo\foo.txt
>>> print(os.path.abspath("//foo"))
\foo
于 python2:
>>> print(os.path.abspath("//foo/foo.txt"))
\foo\foo.txt
>>> print(os.path.abspath("//foo"))
\foo
为什么会这样?
考虑到我必须一起比较路径,有些就像第一个例子,有些像第二个例子,你会如何处理这个问题?
我必须找到的唯一可怕的方法是:
In [34]: re.match(r"^(//|\\)(?!.+(/|\))", "//foo")
Out[34]: <re.Match object; span=(0, 2), match='//'>
In [35]: re.match(r"^(//|\\)(?!.+(/|\))", "\\foo")
Out[35]: <re.Match object; span=(0, 2), match='\\'>
In [36]: re.match(r"^(//|\\)(?!.+(/|\))", "//foo/bar")
In [37]: re.match(r"^(//|\\)(?!.+(/|\))", "\\foo\bar")
所以我最终不得不做类似的事情:
file_path = "//foo"
match = False
if re.match(r"^(//|\\)(?!.+(/|\))", file_path):
match = True
file_path = os.path.abspath(file_path)
if match:
file_path = file_path.replace("\", "\\")
其实,Python3是对的,Python2是错的。 UNC 路径必须至少由两个“组件”组成:
- 服务器或主机名
- 共享名
服务器和共享名组成卷。
更多信息here
在 Windows,python3:
>>> print(os.path.abspath("//foo/foo.txt"))
\foo\foo.txt
>>> print(os.path.abspath("//foo"))
\foo
于 python2:
>>> print(os.path.abspath("//foo/foo.txt"))
\foo\foo.txt
>>> print(os.path.abspath("//foo"))
\foo
为什么会这样?
考虑到我必须一起比较路径,有些就像第一个例子,有些像第二个例子,你会如何处理这个问题?
我必须找到的唯一可怕的方法是:
In [34]: re.match(r"^(//|\\)(?!.+(/|\))", "//foo")
Out[34]: <re.Match object; span=(0, 2), match='//'>
In [35]: re.match(r"^(//|\\)(?!.+(/|\))", "\\foo")
Out[35]: <re.Match object; span=(0, 2), match='\\'>
In [36]: re.match(r"^(//|\\)(?!.+(/|\))", "//foo/bar")
In [37]: re.match(r"^(//|\\)(?!.+(/|\))", "\\foo\bar")
所以我最终不得不做类似的事情:
file_path = "//foo"
match = False
if re.match(r"^(//|\\)(?!.+(/|\))", file_path):
match = True
file_path = os.path.abspath(file_path)
if match:
file_path = file_path.replace("\", "\\")
其实,Python3是对的,Python2是错的。 UNC 路径必须至少由两个“组件”组成:
- 服务器或主机名
- 共享名
服务器和共享名组成卷。
更多信息here