为什么这不起作用,我做错了什么?
>>> 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'
答案 0 :(得分:9)
当os.path.join
遇到绝对路径时,它会将积累的东西扔掉。绝对字符串是以斜杠开头的字符串(在Windows上为ans,带有可选驱动器号)。 normpath
不会触及那个斜线,因为它具有相同的绝对路径概念。你必须去除那条斜线。
如果我可以问:它首先来自哪里?
答案 1 :(得分:4)
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.
答案 2 :(得分:2)
如果您希望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)])