2008-11-27 14 views
5

Imagínese Tengo el siguiente:dividir dos veces en la misma expresión?

inFile = "/adda/adas/sdas/hello.txt" 

# that instruction give me hello.txt 
Name = inFile.name.split("/") [-1] 

# that one give me the name I want - just hello 
Name1 = Name.split(".") [0] 

¿Hay alguna posibilidad de simplificar que hacer el mismo trabajo en una sola expresión?

Respuesta

20

Usted puede obtener lo que quiere plataforma de forma independiente mediante el uso de os.path.basename para conseguir la última parte de un camino y luego usar os.path.splitext para obtener el nombre del archivo sin la extensión.

from os.path import basename, splitext 

pathname = "/adda/adas/sdas/hello.txt" 
name, extension = splitext(basename(pathname)) 
print name # --> "hello" 

Usando os.path.basename y os.path.splitext en lugar de str.split o re.split es más adecuado (y por lo tanto recibieron más puntos que cualquier otra respuesta), ya que no se descompone en otra platforms that use different path separators (you would be surprised how varried this can be).

También lleva a la mayoría de los puntos, ya que responde a su pregunta de "una línea" con precisión y es estéticamente más agradable entonces su ejemplo (aunque esto es discutible, como lo son todas las cuestiones de gusto)

+0

esta es la solución correcta, pero no responde a la pregunta. El mío es el inverso :-) +1. –

+0

+1: solución adecuada a la pregunta n00b. –

+0

@Vinko Vrsalovic el tuyo no es al revés, y responde perfectamente a tu pregunta. –

1
>>> inFile = "/adda/adas/sdas/hello.txt" 
>>> inFile.split('/')[-1] 
'hello.txt' 
>>> inFile.split('/')[-1].split('.')[0] 
'hello' 
0

Estoy bastante seguro algunos Regex-Ninja *, le daría una forma más o menos sensata de hacerlo (o como ahora veo que otros publicaron: formas de escribir dos expresiones en una línea ...)

Pero me pregunto por qué ¿Quieres dividirlo con solo una expresión? Para una división tan simple, probablemente sea más rápido hacer dos que crear una lógica lógica o cualquiera avanzada. Si divide dos veces, también es más seguro:

Supongo que desea separar la ruta, el nombre del archivo y la extensión del archivo, si divide en '/' primero, sabrá que el nombre del archivo debe estar en el último índice de matriz, luego Puede intentar dividir solo el último índice para ver si puede encontrar la extensión del archivo o no. Entonces no necesita preocuparse si hay puntos en los nombres de ruta.

* (Cualquier sanos usuarios de las expresiones regulares, no deberían ofenderse;).

1

si siempre va a ser un camino como el anterior se puede utilizar os.path.split y os.path .splitext

el siguiente ejemplo muestra sólo el hola

from os.path import split, splitext 
path = "/adda/adas/sdas/hello.txt" 
print splitext(split(path)[1])[0] 

Para más información ver https://docs.python.org/library/os.path.html

+0

+1 para el manual de referencia cruzada. Eso siempre es útil. Dale a alguien un pez ... enséñale a alguien a pescar ... –

2

Respondiendo a la pregunta en el tema en lugar de tratar de analizar el ejemplo ...

Usted realmente desea utilizar la solución Florians si desea dividir caminos, pero si promete no utilizar esta ruta para el análisis ...

puede utilizar re.split() para dividir el uso de varios separadores o por: ing con un '|', echar un vistazo a esto:

import re 
inFile = "/adda/adas/sdas/hello.txt" 
print re.split('\.|/', inFile)[-2] 
Cuestiones relacionadas