pathlib路径joinpath()似乎删除主路径的子文件夹,如果与以正斜杠开头的其他路径连接
from pathlib import Path
a = Path(r'c:\main_folder')
a.joinpath(element_a)
element_a = r'subfolderX/subfolderXY/file.txt'
Out[]: WindowsPath('c:/main_folder/subfolderX/subfolderXY/file.txt') # expected
element_b = r'/subfolderX/subfolderXY/file.txt'
a.joinpath(element_b)
Out[]: WindowsPath('c:/subfolderX/subfolderXY/file.txt') # ?! missing 'main_folder'
将路径与element_B连接,结果缺少'main_folder'(!)
我一定是错过了一些(基本的)东西,因为我发现这非常令人困惑,导致很难找到bug
首先,我希望pathlib和它的方法的目的是优雅地处理filepaths的复杂性,以保护开发人员处理这种丑陋。保存不明确的情况,但随后->
其次,如果情况不明确(windows vs posix的差异或诸如此类),我希望库或方法崩溃\不允许使用它,而不是默默地给予我意想不到的结果
第三,主要是,我希望joinpath()方法能够连接这两条路径,而不是其他任何东西
在joinpath()文档中,它返回一个 * 新路径,表示子路径(如果所有参数都是相对路径)或完全不同的路径(如果其中一个参数被锚定)*
什么是“锚定”以及如何绕过它,如果我正在构建一个路径的各种元素,一些配置的,一些由用户提供的,一些剥离的其他路径,我回到笨拙的手动测试斜杠并基于此构建各种字符串连接?
2条答案
按热度按时间tkclm6bt1#
前导
\
用作驱动器的锚。未锚定的路径可以添加到其他路径中,但锚定的路径相对于其他路径具有指向位置的引用。因此,前面的\
将其绑定到当前目录树的根,在本例中为C:\
。你的命令是这样解释的:
C:\main_folder
\
,它将带您回到C:\
subfolderX\subfolderXY\file.txt
。实际上,您是在告诉python将
C:\main_folder
和C:\subfolderX\subfolderXY\file.txt
连接在一起。如果给
joinpath
一个锚定路径,那么第一个路径段将被忽略,如文档中所述。丢弃前导斜杠的最简单方法是执行
"\\abc\\".lstrip("/\\")
,这将删除零个或多个前导/
或\
字符。1rhkuytd2#
首先,我希望pathlib和它的方法的目的是优雅地处理filepaths的复杂性,以保护开发人员处理这种丑陋。保存模棱两可的情况
它所做的,joinpath为你处理向上和根(锚定)遍历。
其次,如果情况不明确(windows vs posix的差异或诸如此类),我希望库或方法崩溃\不允许使用它,而不是默默地给予我意想不到的结果
这没有任何意义,
pathlib
的目标不是为所有可能的文件系统提供一个半成品的公共子集(这是完全不可能的,因为一些文件系统/API甚至没有目录)。\
在windows上是一个路径分隔符,在unices上是一个常规字符,这只是一个东西。模块文档字面上告诉您:
这个模块提供了表示文件系统路径的类,其语义适合于不同的操作系统。
所以它遵循当前系统的语义,如果你想要一个系统的语义超过另一个,使用
Pure*Path
对象,因为它还告诉你:如果你想在Unix机器上操作Windows路径(反之亦然)。在Unix上运行时不能示例化
WindowsPath
,但可以示例化PureWindowsPath
。第三,主要是我希望
joinpath()
方法连接两个路径确实如此它本质上充当一堆目录遍历(cd)。
如果你只想要直接的字符串操作,你已经有了字符串操作,不需要一个专门的模块。
什么是“锚定”以及如何绕过它,如果我正在构建一个路径的各种元素,一些配置的,一些由用户提供的,一些剥离的其他路径,我回到笨拙的手动测试斜杠并基于此构建各种字符串连接?
如果您认为
thing.strip('/')
是“笨拙地手动测试斜杠”,那么是的。你在每一种语言中都会或多或少地面临同样的问题,他们不为琐碎的字符串连接提供 * 文件系统路径操作 *,这是愚蠢的。