【问题标题】:How can I get the proper capitalization for a path?如何获得路径的正确大小写?
【发布时间】:2015-02-12 11:03:39
【问题描述】:

假设我有一个代表目录的类(当然是简化示例):

import os
class Dir:
    def __init__(self, path):
        self.path = os.path.normcase(path)

为了使事情更容易在内部实现,我在将 path 参数保存到属性之前调用了 os.path.normcase。这很好用,但它会小写路径:

>>> import os
>>> os.path.normcase(r'C:\Python34\Lib')
'c:\\python34\\lib'
>>>

我想要一种将路径转换回其正确大写形式的C:\Python34\Lib 的方法。我计划在 __repr__ 方法中执行此操作,以便获得不错的输出,例如:

>>> my_dir
Dir(r'C:\Python34\Lib')
>>>

当我在交互式解释器中时。标准库中有这样的东西吗?


注意:我不是指用户作为path 参数提供的字符串。如果用户这样做:

my_dir = Dir('c:\PYTHON34\lib')

我仍然希望在解释器中打印Dir('C:\Python34\Lib'),因为这是正确的大写。基本上,我希望输出的路径与文件资源管理器中的路径相同。

【问题讨论】:

  • 只是好奇,你为什么关心大小写?
  • @OozeMeister - 这只是出于审美原因。 :) 如果我打印我的 Dir 对象或在字符串中使用它们,我希望有可读的路径。让路径匹配它们在资源管理器中的内容而不是全部小写似乎也更加用户友好。
  • @iCodez:为什么不存储原始路径并仅在需要进行比较时进行规范化?
  • 也许您想使用标准库 pathlib 模块,我记得它会为您处理不区分大小写的比较?
  • @MartijnPieters - 我考虑过这一点,但我只是在__str____repr__ 中使用了正确的路径,因为我在很多地方都使用了规范化路径。所以,我不想在每个使用它的方法中调用normcase。另外,我希望我的 Dir 类能够以大小写方式接受路径,但仅以正确、可读的形式输出它们。

标签: python windows python-3.x path


【解决方案1】:

更新:

对于使用较新版本 Python 的用户,新的pathlib modulepathlib.Path.resolve 的形式拥有此功能:

>>> from pathlib import Path
>>> Path(r'c:\python34\lib').resolve()
WindowsPath('C:/Python34/Lib')
>>> str(Path(r'c:\python34\lib').resolve())
'C:\\Python34\\Lib'
>>>

因此,您可以将用户提供的路径存储为 Path 对象:

from pathlib import Path
class Dir:
    def __init__(self, path):
        self.path = Path(path)

然后像这样实现__repr__ 方法:

def __repr__(self):
    return "Dir('{}')".format(self.path.resolve())

另外,我们不再需要 os.path.normcase 函数,因为 Path 对象直接支持不区分大小写的比较。

pathlib 的一个缺点是它仅在 Python 3.4(当前最新版本)中可用。因此,那些使用较早版本的用户需要获得其版本的反向移植或使用os.path._getfinalpathname 函数,如下所示。


在挖掘标准库时,我在 os.path 模块中发现了一个名为 _getfinalpathname 的未记录函数:

>>> import os
>>> os.path._getfinalpathname(r'c:\python34\lib')
'\\\\?\\C:\\Python34\\Lib'
>>>

使用str.lstrip,我可以得到我需要的输出:

>>> os.path._getfinalpathname(r'c:\python34\lib').lstrip(r'\?')
'C:\\Python34\\Lib'
>>>

这种方法的唯一缺点是该函数未记录并且有些隐藏。但它现在适合我的需要(当然,如果你知道一个更好的方法,我很想听听 :)

【讨论】:

  • 我想更多的是你可能想使用pathlib.Path 而不是编写一个完全自定义的类:) 还有一个名为pathlib 的pypi backlib 可以在2.6+
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多