os.path.join 是否有 Pathlib 替代品?

Is there a Pathlib alternate for os.path.join?

我目前正在使用 Pathlib 访问我的文件的父目录,如下所示:

Path(__file__).parent

当我打印它时,得到以下输出:

print('Parent: ', Path(__file__).parent)
#output
/home/user/EC/main-folder

main-folder 有一个我想访问的 .env 文件,为此我想将父路径与 .env 一起加入。现在,我做了:

dotenv_path = os.path.join(Path(__file__).parent, ".env")

有效。但我想知道,是否有 Pathlib 替代 os.path.join()? 类似于:

dotenv_path = pathlib_alternate_for_join(Path(__file__).parent, ".env")

是的,有:

env_path = Path(__file__).parent / ".env"

/ 就是您所需要的。这将适用于不同的操作系统

你可以这样使用:

(Path(__file__).parent).joinpath('.env')

文档:

pathlib.Path.joinpath

filepath 的以下定义在精神上更接近 os.path.join 吗?

import pathlib
main_dir = 'my_main_dir'
sub_dir = 'sub_dir'
fname = 'filename.tsv'
filepath = pathlib.PurePath(main_dir, sub_dir, fname)

您可以简单地连接 Path 对象和字符串:

    import pathlib
    script_parent_path = pathlib.Path(__file__).parent
    my_dir = ".env"
    my_new_path = pathlib.Path(script_parent_path, my_dir)
    print(my_new_path)

那是因为:

Pathlib's constructors accept pathsegments. Each element of pathsegments can be either a string representing a path segment, an object implementing the os.PathLike interface which returns a string, or another path object - https://docs.python.org/3/library/pathlib.html#pathlib.PurePath

仅供想知道 /pathlib.Path 内部如何工作的人:

    # this is where the magic begins! (overload the '/' operator)
    def __truediv__(self, key): 
        try:
            return self._make_child((key,))
        except TypeError:
            return NotImplemented


    def _make_child(self, args):
        drv, root, parts = self._parse_args(args)
        drv, root, parts = self._flavour.join_parsed_parts(
            self._drv, self._root, self._parts, drv, root, parts)
        return self._from_parsed_parts(drv, root, parts)


    @classmethod
    def _from_parsed_parts(cls, drv, root, parts):
        self = object.__new__(cls)
        self._drv = drv
        self._root = root
        self._parts = parts
        return self  # finally return 'self', which is a Path object.

我认为加入路径最简单的方法是使用

Path(Path(__file__).parent,".env")

另见 definition of pathlib.Path(*pathsegments)

在文档中,为 PurePath 提供了以下语句和示例:

When several absolute paths are given, the last is taken as an anchor (mimicking os.path.join()’s behaviour):

>>> PurePath('/etc', '/usr', 'lib64')

PurePosixPath('/usr/lib64')

>>> PureWindowsPath('c:/Windows', 'd:bar')

PureWindowsPath('d:bar')