【发布时间】:2017-11-30 11:17:11
【问题描述】:
我想打印一个带有斜杠的目录:my_path = pathlib.Path('abc/def')
还有比os.path.join(str(my_path), '')更好的方法吗?
【问题讨论】:
我想打印一个带有斜杠的目录:my_path = pathlib.Path('abc/def')
还有比os.path.join(str(my_path), '')更好的方法吗?
【问题讨论】:
不,你没有错过任何东西。根据设计,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总是代表系统路径风格的分隔符,而路径可以有不同的分隔符。
pathlib 构建路径,那么您应该让pathlib 处理详细信息...除非您处于该错误跟踪器链接中提到的情况并且您需要提供带有斜杠的路径名到一些需要它的程序,在这种情况下你可能在 Posix 系统上。
p/ 不添加os.sep 的情况下,有些路径没有尾部斜杠,例如Path(/) 等(/ 可以是有效的父级,例如Path(/rootfile.txt),因此使用os.sep 连接path.parent 和path.name 通常是错误的!)
pathlib 模块的主要动机是将路径视为对象并使用模块函数/方法来操作它们,以避免旧的os.path 面向字符串的方法可能出现的问题。
Path("/") 是 pathlib 目录(is_dir() 是 True)
要使用 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 的信息,尽管我对使用未记录的功能持谨慎态度:它们可能会在没有通知的情况下消失。 ;)
你也可以使用:
os.path.normpath(str(my_path)) + os.sep
我会说这取决于偏好而不是“更好”
【讨论】:
Path 类本身中遗漏了一些东西......似乎是导入 os.path 来完成这项工作的一种逃避。
os.path.normpath(my_path) raises "AttributeError: 'PosixPath' object has no attribute 'startswith'" --> 需要os.path.normpath(str(my_path))
pathlib 会去除尾部斜杠,并且无法显示带有尾部斜杠的路径。这惹恼了几个人,请参阅here。在 Python 3.6 中添加斜杠的一种紧凑方法是使用 f 字符串,例如 f'{some_path}/' 或 f'{some_path}{os.sep}' 如果您想与操作系统无关。