如何从 Path 切换到 os.path,反之亦然?

How to switch from Path to os.path and vice versa?

每当我想处理文件或目录时,今天的方法是使用 pathlibpathlib很棒,方便,好用,而且OS独立

然而,有些图书馆仍然希望我使用 os.path。 如何将我的 Path 转换为老式版本?

在下面的示例中,我应该如何处理我的 p

from pathlib import Path

p = Path.cwd()
some_old_function(p)   # <---- error

只需将其转换为字符串即可。

from pathlib import Path
p = Path.cwd()
some_old_function(str(p))

现在我也明白了,为什么要介绍pathlib...

短语 有些图书馆仍然希望我使用 os.path 似乎让您感到困惑。 os.path 是一个简单地将路径视为 strings 的模块——与 pathlib 相对,后者将路径视为特定对象OOP 方法。

要在两种表示之间创建简单且定义明确的过渡,PEP 519 was introduced in Python 3.6. It introduces a new abstract class - PathLike - and a new os function - fspath。任何希望实现路径对象(包括 pathlib)的 API/library 应该继承 PathLike 并实现 __fspath__ 方法(将由 os.fspath 调用) .

The main rationale 因为使用 str(path) 容易出错——许多对象都有字符串表示(str(None) 给出 "None"),但它们不应该都是被视为路径。

专门用于 pathlib(在撰写本文时),the implementation of __fspath__ is basically just a wrapper over str(),但您仍然应该更喜欢使用它,以防将来发生变化。

请注意,在将参数传递给大多数内置函数时,您不需要实际调用 os.fspath。大多数 os.path 函数被更改为接受 PathLike 而不是字符串,并且已经在其上使用了 os.fspath (可以在 the docs 中看到,因为 在版本 3.6 中已更改: 接受类似路径的对象。 在大多数函数下)。因此,您可以简单地将 Path 对象按原样传递给它们中的大多数。

您需要将 PosixPath 转换为字符串,os.path需要一个字符串。您可以使用 as_posix 或 str.

In [1]: from pathlib import Path

In [2]: Path.cwd()
Out[2]: PosixPath('/usr/home/ericbsd')

In [3]: Path.cwd().as_posix()
Out[3]: '/usr/home/ericbsd'

In [4]: str(Path.cwd())
Out[4]: '/usr/home/ericbsd

这里是 as_posix 的样子。

from pathlib import Path
p = Path.cwd().as_posix()
some_old_function(p)

至于将 os.path 转换为路径库,您可以使用 PosixPath。

In [1]: from pathlib import PosixPath

In [2]: import os

In [3]: os.getcwd()
Out[3]: '/usr/home/ericbsd'

In [4]: PosixPath(os.getcwd())
Out[4]: PosixPath('/usr/home/ericbsd')