2008-10-08 19 views
5

Me encanta Python porque viene con baterías incluidas, y uso muchas funciones incorporadas para hacer el trabajo sucio por mí.Os.path: ¿Puedes explicar este comportamiento?

Siempre he estado usando felizmente el módulo os.path para hacer frente a la ruta del archivo, pero recientemente he terminado con resultados inesperados en Python 2.5 en Ubuntu Linux, mientras que trata de cadena que representan ventanas rutas de archivos:

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?

Termina de la misma manera con filepath = u "c: \ ttemp \ FILEPA ~ 1.EXE" y filepath = "c: \ ttemp \ FILEPA ~ 1.EXE".

¿Tiene alguna pista? Ubuntu usa UTF8 pero no siento que tenga algo que ver con eso. Tal vez mi instalación de Python está en mal estado, pero no realicé ninguna modificación en particular que pueda recordar.

+0

Es posible que desee revisar su respuesta aceptada: consulte la referencia de Moe a ntpath, que es la forma correcta de hacerlo. –

Respuesta

24

Si se quiere manipular rutas de Windows en Linux que debe utilizar el módulo ntpath (este es el módulo que se importa como os.path en las ventanas - posixpath se importa como os.path en Linux)

>>> 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') 
+2

Esta es una excelente respuesta que merece ser aceptada, en mi humilde opinión.Es mucho mejor usar herramientas ya hechas que crear tus propias expresiones regulares. –

+1

+1 para ntpath; eso es lo que hay que hacer – efotinis

+0

Mi gof, ¡esto es genial! –

3

Desde una documentación os.path:

os.path.splitdrive (ruta)
dividir el trazado nombre de ruta en un par (en coche, cola) donde unidad es o bien una especificación de la unidad o la cadena vacía. En sistemas que no usan especificaciones de unidad, la unidad siempre será la cadena vacía. En todos los casos, drive + tail será el mismo que path.

Si ejecuta esto en Unix, no utiliza las especificaciones de unidad, por lo tanto, la unidad estará vacía.

Si se quiere resolver sendas ventanas en cualquier plataforma, que sólo puede usar una expresión regular simple:

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

drive habrá una letra de unidad seguida de : (por ejemplo c:, u:.) O None, y tail todo el resto :)

+0

Sí, simplemente tenga en cuenta que: el proceso de cadena se basa en el sistema operativo, no en la sintaxis. No hace ninguna diferencia entre Win y Unix, solo aplica un algoritmo diferente según su plataforma. Mierda. –

+0

No use expresiones regulares, use el módulo ntpath en su lugar - vea mi respuesta. – Moe

+0

Sin ofender kender, tiene razón :-) –

1

Consulte la documentación here, específicamente:

splitdrive (p) Dividir un nombre de ruta en el disco y la ruta. En Posix, la unidad es siempre vacía.

Esto no funcionará en una caja de Linux.

Cuestiones relacionadas