В Python 2 и 3 с использованием модуля pathlib2 :
import posixpath # to generate unix paths
from pathlib2 import PurePath, PureWindowsPath, PurePosixPath
def path2unix(path, nojoin=True, fromwinpath=False):
"""From a path given in any format, converts to posix path format
fromwinpath=True forces the input path to be recognized as a Windows path (useful on Unix machines to unit test Windows paths)"""
if not path:
return path
if fromwinpath:
pathparts = list(PureWindowsPath(path).parts)
else:
pathparts = list(PurePath(path).parts)
if nojoin:
return pathparts
else:
return posixpath.join(*pathparts)
Использование:
In [9]: path2unix('lala/lolo/haha.dat')
Out[9]: ['lala', 'lolo', 'haha.dat']
In [10]: path2unix(r'C:\lala/lolo/haha.dat')
Out[10]: ['C:\\', 'lala', 'lolo', 'haha.dat']
In [11]: path2unix(r'C:\lala/lolo/haha.dat') # works even with malformatted cases mixing both Windows and Linux path separators
Out[11]: ['C:\\', 'lala', 'lolo', 'haha.dat']
С вашим тестовым набором:
In [12]: testcase = paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
...: ... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
In [14]: for t in testcase:
...: print(path2unix(t)[-1])
...:
...:
c
c
c
c
c
c
c
Идея состоит в том, чтобы преобразовать все пути в единое внутреннее представление pathlib2
с различными декодерами в зависимости от платформы.К счастью, pathlib2
включает в себя универсальный декодер PurePath
, который должен работать на любом пути.Если это не работает, вы можете принудительно распознать путь Windows, используя fromwinpath=True
.Это разделит входную строку на части, последним будет искомый лист, следовательно, path2unix(t)[-1]
.
Если аргумент nojoin=False
, путь будет соединен обратно, так что выходэто просто входная строка, преобразованная в формат Unix, которая может быть полезна для сравнения подпутей на разных платформах.