用pathlib获取主目录

69 投票
5 回答
41436 浏览
提问于 2025-04-18 01:55

在查看Python 3.4的新模块pathlib时,我发现没有简单的方法可以获取用户的主目录。现在我想到的获取用户主目录的方法是使用较旧的os.path库,像这样:

import pathlib
from os import path
p = pathlib.Path(path.expanduser("~"))

这看起来有点麻烦。有没有更好的方法呢?

5 个回答

-3

注意: 这个回答是针对3.4版本的。正如其他回答所提到的,这个功能在后来的版本中才被添加。

看起来没有更好的方法来做到这一点。我刚刚查了一下文档,但是没有找到和我搜索的内容相关的信息。

  • ~ 没有任何结果
  • expand 也没有任何结果
  • user 只有1个结果,是Path.owner()的返回值
  • relative 有8个结果,大多数和PurePath.relative_to()有关
9

对于那些懒得去看评论的人:

现在有了一个叫做 pathlib.Path.home 的方法。

42

这里有一个叫做 方法 的东西,名字是 expanduser()

p = PosixPath('~/films/Monty Python')
p.expanduser()
# => PosixPath('/home/eric/films/Monty Python')
129

从Python 3.5开始,有了一个叫做 pathlib.Path.home() 的功能,这让情况有所改善。

在Windows系统上,结果是

>>>pathlib.Path.home()
WindowsPath('C:/Users/username')

而在Linux系统上,结果是

>>>pathlib.Path.home()
PosixPath('/home/username') 
5

看起来这个方法是在一个错误报告中提到的,具体可以在这里找到。有人写了一些代码(可以在这里查看),但遗憾的是,这些代码似乎没有被包含在最终的Python 3.4版本中。

顺便提一下,提议的代码和你在问题中提到的代码非常相似:

# As a method of a Path object
def expanduser(self):
    """ Return a new path with expanded ~ and ~user constructs
    (as returned by os.path.expanduser)
    """
    return self.__class__(os.path.expanduser(str(self)))

编辑

这里有一个简单的子类版本PathTest,它是从WindowsPath继承而来的(我在使用Windows系统,但你可以用PosixPath替换它)。这个版本增加了一个基于错误报告中提交的代码的classmethod

from pathlib import WindowsPath
import os.path

class PathTest(WindowsPath):

    def __new__(cls, *args, **kwargs):
        return super(PathTest, cls).__new__(cls, *args, **kwargs)

    @classmethod
    def expanduser(cls):
        """ Return a new path with expanded ~ and ~user constructs
        (as returned by os.path.expanduser)
        """
        return cls(os.path.expanduser('~'))

p = PathTest('C:/')
print(p) # 'C:/'

q = PathTest.expanduser()
print(q) # C:\Users\Username

撰写回答