os.path.join的Pathlib替代方案是什么?

123

我目前正在使用 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")

2
这个回答解决了你的问题吗?如何在Python中将字符串附加到路径? - Azat Ibrakov
1
https://docs.python.org/3/library/pathlib.html#operators - Alex
还可以在文档中查看os.path和pathlib之间的比较。请访问此链接:https://docs.python.org/3/library/pathlib.html#correspondence-to-tools-in-the-os-module - djvg
6个回答

119

是的,有:

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

/ 就是你所需要的。这在不同的操作系统中都可以使用。


它支持 Path(__file__).parent / "../env" 吗? - Learner
3
你总是可以这样做,Path(file).parent.parent / "env" - quest
2
或者 Path(__file__).parents[1] / "env" - Javier TG
7
那是一个很好的运算符重载。 - Connor
确实,非常优美和优雅 :) - quest

65
你可以使用这样的代码:

你可以像这样使用:

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

文档:

pathlib.Path.joinpath


虽然我认为更好地分散这些是艺术。 - Quinten C

11

以下对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)

3
我意识到我的建议可能并没有直接解决原问题的背景,但是搜索“pathlib os.path.join alternative”会将此页面作为顶部结果返回 :-) - Quetzalcoatl

10
您可以简单地连接路径对象和字符串:
    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的构造函数接受路径段。每个路径段可以是表示路径段的字符串,实现os.PathLike接口并返回字符串的对象,或者是另一个路径对象 - https://docs.python.org/3/library/pathlib.html#pathlib.PurePath


2

我认为连接路径最简单的方法是使用

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

请参阅pathlib.Path(*pathsegments)的定义
在文档中,对于PurePath,给出了以下语句和示例:
当给出多个绝对路径时,最后一个被视为锚点(模仿os.path.join()的行为): >>> PurePath('/etc', '/usr', 'lib64') PurePosixPath('/usr/lib64') >>> PureWindowsPath('c:/Windows', 'd:bar') PureWindowsPath('d:bar')

1

对于任何想知道 /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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接