如何从 Path 切换到 os.path,反之亦然?
How to switch from Path to os.path and vice versa?
每当我想处理文件或目录时,今天的方法是使用 pathlib
。
pathlib
很棒,方便,好用,而且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')
每当我想处理文件或目录时,今天的方法是使用 pathlib
。
pathlib
很棒,方便,好用,而且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')