Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连接:字符串和绝对路径与os.path_Python_String_Path - Fatal编程技术网

Python 连接:字符串和绝对路径与os.path

Python 连接:字符串和绝对路径与os.path,python,string,path,Python,String,Path,为什么这不起作用,我做错了什么 >>> p1 = r'\foo\bar.txt' >>> os.path.join('foo1', 'foo2', os.path.normpath(p1)) '\\foo\\bar.txt' 我预料到: 'foo1\\foo2\\foo\\bar.txt' 编辑: 解决办法 p1是一个绝对路径(以\开头)-因此,根据文档,它由自身返回: join(a, *p) Join two or more pathname c

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

>>> p1 = r'\foo\bar.txt'
>>> os.path.join('foo1', 'foo2', os.path.normpath(p1))
'\\foo\\bar.txt'
我预料到:

'foo1\\foo2\\foo\\bar.txt'
编辑:

解决办法 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.

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


如果我可以问:它从何而来?

如果您想要
os.path.join.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)])

在我的Python上,它可以像预期的那样工作。@rubik:你是否碰巧使用了*nix?@delnan:是的,我正在使用UbuntuSo,为了得到想要的结果,只需将第一行更改为
p1=r'foo\bar.txt'
。在这种情况下,
p1.strip('\\\\')
在Linux和Windows上同样工作?@marw如果你有其他类型的绝对路径,它就不够了(例如,在Windows上以“/”开头,或以“C:”之类的驱动器号开头)。例如,请参阅
ntpath.join('foo','C:\\bar')
我通过将需要添加到另一个路径的路径拆分而获得它。我正在尝试生成一个代码,该代码递归地将文件/目录从一个文件夹复制到另一个文件夹,但不是“实时”复制,但是通过创建diles/dirs列表,然后稍后使用该列表创建文件。我可以合理地确定
os.path.join(p1,p2.lstrip(os.sep))
在Windows下失败,因为每个路径的前缀都是驱动器说明符,而不是
os.sep
。因为这两个路径可能位于不同的驱动器下,所以不清楚在Windows下应该做什么-这可能解释了为什么
os.path.join()
首先会默默拒绝这样做。
# Make sure all folder names are lowercase:
os.path.join(p1, *[x.lower() for x in p2.split(os.sep)])