如何为路径获得正确的大小写?

时间:2014-12-14 01:56:18

标签: python windows python-3.x path

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

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'),因为这是正确的大小写。基本上,我希望输出的路径与文件浏览器中的路径相同。

1 个答案:

答案 0 :(得分:3)

<强>更新

对于使用较新版本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的{​​{1}}模块中遇到了一个未记录的函数:

_getfinalpathname

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

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

这种方法唯一的缺点是函数没有文档并且有些隐藏。但它现在适合我的需要(当然,如果你知道一个,我会喜欢听到更好的方法:)

相关问题