Tanto en Python 2 como en 3, usando el módulo 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)
Uso:
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']
Con tu caso de prueba:
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
...:
...:
c
c
c
c
c
c
c
La idea aquí es convertir todos los caminos en la representación interna unificada de pathlib2
, con diferentes decodificadores según la plataforma. Afortunadamente, pathlib2
incluye un decodificador genérico llamado PurePath
que debería funcionar en cualquier camino. En caso de que esto no funcione, puede forzar el reconocimiento de la ruta de Windows usando fromwinpath=True
. Esto dividirá la cadena de entrada en partes, la última es la hoja que está buscando, de ahí la path2unix
Si el argumento nojoin=False
, la ruta se volverá a unir, de modo que la salida sea simplemente la cadena de entrada convertida a un formato Unix, que puede ser útil para comparar subrutas entre plataformas.