【问题标题】:What's the best way to add a trailing slash to a pathlib directory?将斜杠添加到 pathlib 目录的最佳方法是什么?
【发布时间】:2017-11-30 11:17:11
【问题描述】:

我想打印一个带有斜杠的目录:my_path = pathlib.Path('abc/def')

还有比os.path.join(str(my_path), '')更好的方法吗?

【问题讨论】:

    标签: python pathlib


    【解决方案1】:

    不,你没有错过任何东西。根据设计,pathlib 会去除尾部斜杠,并且无法显示带有尾部斜杠的路径。正如错误跟踪器中提到的那样,这已经惹恼了几个人:pathlib strips trailing slash

    在 Python 3.6 中添加斜杠的一种紧凑方法是使用 f 字符串,例如 f'{some_path}/'f'{some_path}{os.sep}' 如果您想与操作系统无关。

    from pathlib import Path
    import os
    
    some_path = '/etc'
    p = Path(some_path)
    print(f'{p}/')
    print(f'{p}{os.sep}')
    

    输出

    /etc/
    /etc/
    

    另一种选择是添加一个虚拟组件并将其从结果字符串中分割出来:

    print(str(p/'@')[:-1])
    

    【讨论】:

    • 两种方式可能不等价:os.sep总是代表系统路径风格的分隔符,而路径可以有不同的分隔符。
    • @EugeneYarmash 确实如此。但是 OP 只是为了显示目的添加了一个斜杠:“我有一个目录,我想用斜杠打印出来”。因此,对于这种特殊情况,我们真的不需要担心。如果您实际上是使用pathlib 构建路径,那么您应该让pathlib 处理详细信息...除非您处于该错误跟踪器链接中提到的情况并且您需要提供带有斜杠的路径名到一些需要它的程序,在这种情况下你可能在 Posix 系统上。
    • 虚拟组件可能更可取 - 在p/ 不添加os.sep 的情况下,有些路径没有尾部斜杠,例如Path(/) 等(/ 可以是有效的父级,例如Path(/rootfile.txt),因此使用os.sep 连接path.parentpath.name 通常是错误的!)
    • @GPhys 当然,但这个问题(和我的答案)是关于操纵路径 strings 以制作对打印的人类友好表示(但我想它对于保存也很有用CSV、JSON 等的路径字符串)。 pathlib 模块的主要动机是将路径视为对象并使用模块函数/方法来操作它们,以避免旧的os.path 面向字符串的方法可能出现的问题。
    • 问题是明确的关于 pathlib 目录; Path("/") 是 pathlib 目录(is_dir()True
    【解决方案2】:

    要使用 pathlib 添加路径风格的尾部斜杠,您可以这样做:

    >>> from pathlib import Path
    >>> my_path = Path("abc/def")
    >>> str(my_path / "_")[:-1]  # add a dummy "_" component, then strip it
    'abc/def/'
    

    查看source,还有一个Path._flavour.sep属性:

    >>> str(my_path) + my_path._flavour.sep
    'abc/def/'
    

    但它似乎还没有任何记录在案的访问器。

    【讨论】:

    • 感谢您提供有关_flavour.sep 的信息,尽管我对使用未记录的功能持谨慎态度:它们可能会在没有通知的情况下消失。 ;)
    【解决方案3】:

    你也可以使用:

    os.path.normpath(str(my_path)) + os.sep
    

    我会说这取决于偏好而不是“更好”

    【讨论】:

    • 澄清一下,我希望我在 Path 类本身中遗漏了一些东西......似乎是导入 os.path 来完成这项工作的一种逃避。
    • and os.path.normpath(my_path) raises "AttributeError: 'PosixPath' object has no attribute 'startswith'" -​​-> 需要os.path.normpath(str(my_path))
    • @Tom,不,你没有错过任何东西。根据设计,pathlib 会去除尾部斜杠,并且无法显示带有尾部斜杠的路径。这惹恼了几个人,请参阅here。在 Python 3.6 中添加斜杠的一种紧凑方法是使用 f 字符串,例如 f'{some_path}/'f'{some_path}{os.sep}' 如果您想与操作系统无关。
    • @Tom 哦,好的。我通常不做 f-string 答案,因为它们会让使用旧版本的人感到沮丧。请注意:f 字符串会高度上瘾,并且比其他格式化选项快很多。 :)
    • 3.6 已经快一年了,应该告诉人们升级的理由:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2018-08-10
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多