一个不会丢弃开头斜杠的os.path.join()?

13

Python的os.path.join描述为“大多数情况下没有意义”, 因为它会丢弃任何前面不带斜杠的参数。暂且不论这是有意为之并且已经记录在案的行为,是否有现成的函数或代码模式可以避免这种情况发生?

给定HOMEPATH=\users\myname,以下代码将会丢弃路径的开头。

print os.path.join('C:\one', os.environ.get("HOMEPATH"), 'three')

结果:

\Users\myname\three

期望的:

C:\one\Users\myname\three

由于我曾经被这个问题困扰过几次,现在当我自己写代码时,我已经很擅长注意到前导斜杠。但是,如果你不知道传入的字符串是什么样子的呢?就像这个例子一样。


5
很抱歉这个功能会多次影响到你,但这是一个有意为之的、已被记录的特性。 - Martijn Pieters
4
文档明确表明这是有意的行为,但考虑到我从相关答案中借来的“几乎无用”的评论已经获得了14个或更多的赞同,我肯定不是唯一认为应该有替代方案的人。 - matt wilkie
另外一种方法是确保你的参数不以斜杠开头。例如,可以使用如下一行代码:args = [a[1:] for a in args if a.startswith('\\') else a]或类似的操作。我认为大多数人都知道它应该如何工作。或者你也可以修复HOMEPATH,在Windows上它应该在文件系统根目录,但如果你以不同的方式使用它,那么你应该让它看起来像一个相对路径,而不是绝对路径。 - dash-tom-bang
@mattwilkie:我的评论无法被downvoted。如果可以的话,我会这么做的。根据很多第一次提问 Python 问题者的问题质量来看,找到14个人不理解为什么os.path.join()会这样做并不难。 - Martijn Pieters
2个回答

11
也许 os.environ.get("HOMEPATH").lstrip(os.path.sep)... 如果你能够在每个参数(或第二个及更多参数)上执行此操作,那么编写自己版本的join就很容易了。

1
我没有抄袭你的答案;-)只是在手机上打字需要更长时间。 - jdi

6

只需去掉斜杠

path = os.environ.get("HOMEPATH").lstrip(os.path.sep)
os.path.join('C:\one', path, 'three')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接