假设我有一个代表目录的类(当然是简化示例):
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')
,因为这是正确的大小写。基本上,我希望输出的路径与文件浏览器中的路径相同。
答案 0 :(得分:3)
<强>更新强>
对于使用较新版本Python的用户,新pathlib
module以pathlib.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'
>>>
这种方法唯一的缺点是函数没有文档并且有些隐藏。但它现在适合我的需要(当然,如果你知道一个,我会喜欢听到更好的方法:)