为什么os.normpath不处理前导的双斜杠?

5 投票
1 回答
1975 浏览
提问于 2025-04-17 04:35

在Unix系统中,os.path.normpath这个函数会把多个斜杠合并成一个,但如果路径开头有正好两个斜杠,它就不会合并。 为什么会有这个例外呢?

为了说明这个问题,我得到了以下的转换结果:

//double/slash/stays -> //double/slash/stays
/double/slash//gone// -> /double/slash/gone/
double//slash//gone/ -> double/slash/gone
///triple/slash/gone -> /triple/slash/gone
////quad/slash/gone -> /quad/slash/gone

这让我觉得有点奇怪。我隐约觉得这可能对SMB挂载或网址有用,但我并不太关心这些。Python的这种行为有什么深层的道理吗?还是说我应该自己把开头的//合并掉呢?

[更新] 根据下面的回答,看来最好的做法是不要合并这两个斜杠,而是要么接受它,要么把它当作一个错误来处理。

1 个回答

9

因为POSIX标准允许以两条斜杠开头的路径以实现定义的方式来处理。换句话说,在所有POSIX系统中,//foo不一定和/foo表示同样的意思。

根据IEEE Std 1003.1的规定:

以两个连续的斜杠开头的路径名可以以实现定义的方式进行解释,但超过两个的开头斜杠应该被视为一个斜杠。

另请参见这个错误报告(该报告被关闭,理由是“不是一个错误”)。

撰写回答