连接:字符串和带有os.path的绝对路径

2024-09-30 15:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么这不起作用,我做错什么了?

>>> p1 = r'\foo\bar.txt'
>>> os.path.join('foo1', 'foo2', os.path.normpath(p1))
'\\foo\\bar.txt'

我预料到:

'foo1\\foo2\\foo\\bar.txt'

编辑:

解决办法

>>> p1 = r'\foo\bar.txt'
>>> p1 = p1.strip('\\') # Strip '\\' so the path would not be absolute 
>>> os.path.join('foo1', 'foo2', os.path.normpath(p1))
'foo1\\foo2\\foo\\bar.txt'

Tags: pathtxt编辑sofooosbarstrip
3条回答

如果希望os.path.join的目标行为将两个绝对路径连接在一起,请去掉分隔符:

import os
p1 = os.path.join(os.sep, 'foo1', 'foo2')
p2 = os.path.join(os.sep, 'foo', 'bar.txt')

os.path.join(p1, p2.lstrip(os.sep))

如果要修改路径,也可以使用列表理解来执行类似的酷操作:

# Make sure all folder names are lowercase:
os.path.join(p1, *[x.lower() for x in p2.split(os.sep)])

os.path.join遇到一个绝对路径时,它会把它积累到的东西扔掉。绝对字符串是以斜线开头的字符串(在windows上是ans,带有可选的驱动器号)。normpath不会碰到斜杠,因为它有相同的绝对路径概念。你必须去掉那条斜线。

如果我可以问:它最初是从哪里来的?

p1是一个绝对路径(以\开头),因此根据文档,它是自己返回的:

join(a, *p)
    Join two or more pathname components, inserting "\" as needed.
    If any component is an absolute path, all previous path components
    will be discarded.

相关问题 更多 >