2008-11-27 16 views
5

Wyobraźmy mam następujące:podzielić dwa razy w tym samym wyrażeniu?

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] 

Czy jest jakaś szansa na uproszczenie, że robi to samo zadanie w ciągu zaledwie jednego wyrazu?

Odpowiedz

20

można dostać to, czego chcesz platformę niezależnie za pomocą os.path.basename dostać ostatnią część drogi, a następnie użyj os.path.splitext aby uzyskać nazwę pliku bez rozszerzenia.

from os.path import basename, splitext 

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

Korzystanie os.path.basename i os.path.splitext zamiast str.split lub re.split jest bardziej właściwe (i dlatego otrzymał więcej punktów następnie każda inna odpowiedź), ponieważ nie rozbić na drugiej platforms that use different path separators (you would be surprised how varried this can be).

Niesie też najwięcej punktów, ponieważ odpowiada na pytanie o „jednej linii” precyzyjnie i jest bardziej estetyczny wówczas przykładem (choć to wątpliwe jak wszystkie kwestie smaku)

+0

to jest właściwe rozwiązanie, ale nie odpowiada na to pytanie. Mój jest odwrotny :-) +1. –

+0

+1: właściwe rozwiązanie dla pytania n00b. –

+0

@Vinko Vrsalovic Twój nie jest odwrotny i doskonale odpowiada na twoje pytanie. –

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

jestem całkiem pewny jakiś Regex-Ninja *, dałby ci mniej lub bardziej rozsądny sposób, aby to zrobić (lub jak teraz widzę, że inni napisali: sposoby pisania dwóch wyrażeń w jednym wierszu ...)

Ale zastanawiam się, dlaczego chcesz podzielić go za pomocą tylko jednego wyrażenia? Dla takiego prostego podziału, prawdopodobnie szybsze jest wykonanie dwóch zadań niż utworzenie zaawansowanej albo - albo logicznej. Jeśli podzielisz dwa razy, jest to również bezpieczniejsze:

Chyba chcesz oddzielić ścieżkę, nazwę pliku i rozszerzenie pliku, jeśli podzielisz się na "/" najpierw wiesz, że nazwa pliku powinna znajdować się w ostatnim indeksie tablicy, a następnie możesz spróbować podzielić tylko ostatni indeks, aby sprawdzić, czy możesz znaleźć rozszerzenie pliku, czy nie. Wtedy nie musisz przejmować się, czy w nazwach ścieżek znajdują się kropki.

* (Wszelkie sane użytkownicy wyrażeń regularnych, nie powinien się obrazić;).

1

jeśli jest ona zawsze będzie ścieżkę jak wyżej można użyć os.path.split i os.path .splitext

Poniższy przykład będzie drukować tylko cześć

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

więcej informacji można znaleźć https://docs.python.org/library/os.path.html

+0

+1 dla ręcznego przekierowania. To zawsze pomocne. Daj komuś rybę ... naucz kogoś łowić ... –

2

Odpowiadając na pytanie w temacie zamiast próbować analizować przykład ...

Naprawdę chcesz użyć Florians rozwiązanie, jeśli chcesz podzielić ścieżki, ale jeśli nie obiecuję, aby skorzystać z tej ścieżki do analizowania ...

można użyć re.split() podzielić za pomocą kilku separatorów przez albo: ing je znakiem „|”, rzucić okiem na to:

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