7

我喜欢 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')

怎么回事?

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

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

4

3 回答 3

26

如果你想在 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')
于 2008-10-08T12:11:55.803 回答
4

os.path文档:

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

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

如果你想在任何平台上解决 windows 路径,你可以使用一个简单的正则表达式:

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

drive将是一个驱动器号,后跟:(例如c:u:)或None,以及tail整个其余部分:)

于 2008-10-08T11:38:57.697 回答
1

请参阅此处的文档,特别是:

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

所以这在Linux机器上不起作用。

于 2008-10-08T11:39:03.780 回答