Pobierz nazwę pliku bez rozszerzenia w Pythonie

Odpowiedzi:

203

W większości przypadków nie powinieneś do tego używać wyrażenia regularnego.

os.path.splitext(filename)[0]

Spowoduje to również .bashrcpoprawną obsługę nazwy pliku , zachowując całą nazwę.

Marcelo Cantos
źródło
4
Nie działa poprawnie z „git-1.7.8.tar.gz”, gdzie usuwa tylko „.gz”. Używam basename[:-len(".tar.gz")]do tego.
niebieskawe
28
@blueyed: „Nie działa prawidłowo” to kwestia perspektywy. Plik jest plikiem gzip, którego nazwisko jest podstawa git-1.7.8.tar. Nie ma sposobu, aby poprawnie odgadnąć, ile kropek dzwoniący chce usunąć, więc splitext()usuwa tylko ostatnią. Jeśli chcesz obsługiwać przypadki krawędziowe .tar.gz, musisz to zrobić ręcznie. Oczywiście nie możesz usunąć wszystkich kropek, ponieważ skończysz git-1.
Marcelo Cantos,
26
>>> import os
>>> os.path.splitext("1.1.1.1.1.jpg")
('1.1.1.1.1', '.jpg')
Lennart Regebro
źródło
10

Gdybym miał to zrobić za pomocą wyrażenia regularnego, zrobiłbym to tak:

s = re.sub(r'\.jpg$', '', s)
Alan Moore
źródło
7

Możesz użyć metody macierzystej , aby uzyskać nazwę pliku.

Oto przykład:

from pathlib import Path

p = Path(r"\\some_directory\subdirectory\my_file.txt")
print(p.stem)
# my_file
Vlad Bezden
źródło
6

Nie ma potrzeby używania wyrażenia regularnego. os.path.splitextjest twoim przyjacielem:

os.path.splitext('1.1.1.jpg')
>>> ('1.1.1', '.jpg')
Tryptyk
źródło