Os.path:你能解释一下这种行为吗?

时间:2008-10-08 11:32:16

标签: python path

我喜欢Python,因为它包含电池,而且我使用内置函数来为我做脏事。

我一直在愉快地使用os.path模块来处理文件路径但是最近我在Ubuntu linux下的Python 2.5上得到了意想不到的结果,同时处理代表windows文件路径的字符串:

filepath = r"c:\ttemp\FILEPA~1.EXE"
print os.path.basename(filepath)
'c:\\ttemp\\FILEPA~1.EXE']
print os.path.splitdrive(filepath)
('', 'c:\ttemp\\FILEPA~1.EXE')

WTF?

它以与filepath = u“c:\ ttemp \ FILEPA~1.EXE”和filepath =“c:\ ttemp \ FILEPA~1.EXE”相同的方式结束。

你有线索吗? Ubuntu使用UTF8,但我不觉得它与它有关。也许我的Python安装搞砸了,但我没有对它进行任何特别的调整,我记得。

3 个答案:

答案 0 :(得分:24)

如果你想在linux上操作Windows路径,你应该使用ntpath模块(这是在windows上作为os.path导入的模块 - posixpath在linux上作为os.path导入)

>>> import ntpath
>>> filepath = r"c:\ttemp\FILEPA~1.EXE"
>>> print ntpath.basename(filepath)
FILEPA~1.EXE
>>> print ntpath.splitdrive(filepath)
('c:', '\\ttemp\\FILEPA~1.EXE')

答案 1 :(得分:3)

来自os.path文档:

<强> os.path.splitdrive(路径)
将路径名路径拆分为一对(驱动器,尾部),其中驱动器是驱动器规范或空字符串。在不使用驱动器规格的系统上,驱动器将始终为空字符串。在所有情况下,drive + tail将与path相同。

如果你在unix上运行它,它不使用驱动器规格,因此 - 驱动器将是空字符串。

如果要在任何平台上解决Windows路径,可以使用简单的正则表达式:

import re
(drive, tail) = re.compile('([a-zA-Z]\:){0,1}(.*)').match(filepath).groups() 

drive将是一封驱动器号,后跟:(例如c:u:)或Nonetail整个休息:)

答案 2 :(得分:1)

请参阅文档here,具体来说:

  

splitdrive(p)将路径名拆分为   驱动器和路径。 在Posix上,驱动器是   永远是空的。

所以这不适用于Linux机器。