python pathllib joinpath()如果其他路径以斜杠开头,则会删除部分主路径

oyt4ldly  于 2023-06-20  发布在  Python
关注(0)|答案(2)|浏览(155)

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()文档中,它返回一个 * 新路径,表示子路径(如果所有参数都是相对路径)或完全不同的路径(如果其中一个参数被锚定)*
什么是“锚定”以及如何绕过它,如果我正在构建一个路径的各种元素,一些配置的,一些由用户提供的,一些剥离的其他路径,我回到笨拙的手动测试斜杠并基于此构建各种字符串连接?

tkclm6bt

tkclm6bt1#

前导\用作驱动器的锚。未锚定的路径可以添加到其他路径中,但锚定的路径相对于其他路径具有指向位置的引用。因此,前面的\将其绑定到当前目录树的根,在本例中为C:\
你的命令是这样解释的:

  • 转到C:\main_folder
  • 跟随\,它将带您回到C:\
  • 从那里转到subfolderX\subfolderXY\file.txt

实际上,您是在告诉python将C:\main_folderC:\subfolderX\subfolderXY\file.txt连接在一起。
如果给joinpath一个锚定路径,那么第一个路径段将被忽略,如文档中所述。
丢弃前导斜杠的最简单方法是执行"\\abc\\".lstrip("/\\"),这将删除零个或多个前导/\字符。

1rhkuytd

1rhkuytd2#

首先,我希望pathlib和它的方法的目的是优雅地处理filepaths的复杂性,以保护开发人员处理这种丑陋。保存模棱两可的情况
它所做的,joinpath为你处理向上和根(锚定)遍历。
其次,如果情况不明确(windows vs posix的差异或诸如此类),我希望库或方法崩溃\不允许使用它,而不是默默地给予我意想不到的结果
这没有任何意义,pathlib的目标不是为所有可能的文件系统提供一个半成品的公共子集(这是完全不可能的,因为一些文件系统/API甚至没有目录)。\在windows上是一个路径分隔符,在unices上是一个常规字符,这只是一个东西。
模块文档字面上告诉您:
这个模块提供了表示文件系统路径的类,其语义适合于不同的操作系统。
所以它遵循当前系统的语义,如果你想要一个系统的语义超过另一个,使用Pure*Path对象,因为它还告诉你:
如果你想在Unix机器上操作Windows路径(反之亦然)。在Unix上运行时不能示例化WindowsPath,但可以示例化PureWindowsPath
第三,主要是我希望joinpath()方法连接两个路径
确实如此它本质上充当一堆目录遍历(cd)。
如果你只想要直接的字符串操作,你已经有了字符串操作,不需要一个专门的模块。
什么是“锚定”以及如何绕过它,如果我正在构建一个路径的各种元素,一些配置的,一些由用户提供的,一些剥离的其他路径,我回到笨拙的手动测试斜杠并基于此构建各种字符串连接?
如果您认为thing.strip('/')是“笨拙地手动测试斜杠”,那么是的。你在每一种语言中都会或多或少地面临同样的问题,他们不为琐碎的字符串连接提供 * 文件系统路径操作 *,这是愚蠢的。

相关问题