Jak uzyskać nazwę pliku bez rozszerzenia ze ścieżki w Pythonie?
994
Pobieranie nazwy pliku bez rozszerzenia:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Wydruki:
/path/to/some/file
Dokumentacja dlaos.path.splitext
.
Ważna uwaga: jeśli nazwa pliku zawiera wiele kropek, usuwane jest tylko rozszerzenie po ostatniej. Na przykład:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Wydruki:
/path/to/some/file.txt.zip
Zobacz inne odpowiedzi poniżej, jeśli chcesz poradzić sobie z tą sprawą.
splitext('kitty.jpg.zip')
daje('kitty.jpg', '.zip')
).splitext(basename('/some/path/to/file.txt'))[0]
(co zawsze robię)Możesz tworzyć własne za pomocą:
Ważna uwaga: jeśli
.
w nazwie pliku znajduje się więcej niż jedna , usuwana jest tylko ostatnia. Na przykład:Poniżej znajdują się inne odpowiedzi na to pytanie.
źródło
os
.Używanie
pathlib
w Pythonie 3.4+wróci
źródło
os.path
rozwiązania spowoduje to usunięcie tylko jednego rozszerzenia (lubsuffix
, jakpathlib
to się nazywa).Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
jest właściwą drogą. Prawdopodobnie chciałbyś zapętlić dop.suffix == ''
.źródło
`
do wyświetlenia kodu i „/somepath/hermanth.txt” jako instancji ścieżki.os.path.basename
nie jest konieczne.os.path.basename
powinien być używany tylko do uzyskania nazwy pliku ze ścieżki pliku.W Pythonie 3.4+ możesz użyć tego
pathlib
rozwiązaniaźródło
resolve()
ścieżką? Czy naprawdę jest możliwe uzyskanie ścieżki do pliku i bez tego, aby nazwa pliku nie była częścią ścieżki bez tego? Oznacza to, że jeśli podasz ścieżkę do dowiązania symbolicznego, zwrócisz nazwę pliku (bez rozszerzenia) pliku, na który wskazuje dowiązanie symboliczne.resolve()
jest pomoc w rozwiązaniu problemu wielu kropek. Poniższa odpowiedź na temat korzystania z indeksu nie będzie działać, jeśli ścieżka to „./foo.tar.gz”https://docs.python.org/3/library/os.path.html
W python 3 pathlib „Moduł pathlib oferuje obiekty ścieżki wysokiego poziomu”. więc,
źródło
Jeśli chcesz zachować ścieżkę do pliku i po prostu usuń rozszerzenie
źródło
'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
os.path.splitext () nie będzie działać, jeśli rozszerzenie ma wiele kropek.
Na przykład images.tar.gz
Możesz po prostu znaleźć indeks pierwszej kropki w basenieame, a następnie pokroić basename, aby uzyskać tylko nazwę pliku bez rozszerzenia.
źródło
.tar.gz
.tar.bz
.tar.7z
'haystack'.index('needle')
zgłasza wyjątek ValueError, jeśli igła (w powyższym przypadku kropka.
) nie znajduje się w stogu siana. Istnieją również pliki bez żadnego rozszerzenia.@ IceAdor's odnosi się do rsplit w komentarzu do rozwiązania @ user2902201. rsplit to najprostsze rozwiązanie, które obsługuje wiele okresów.
Tutaj jest napisane:
mój raport
źródło
import os
, a następnie użyjos.path.basename
import
ingos
nie oznacza, że możesz używaćos.foo
bez odwoływania się doos
.źródło
from os import foo
.os
modułu, jeśli ma on element o nazwiefoo
.path
, lubwalk
).Pomyślałem, że wrzucę wariant użycia os.path.splitext bez potrzeby korzystania z indeksowania tablic.
Funkcja zawsze zwraca
(root, ext)
parę, więc korzystanie z niej jest bezpieczne:root, ext = os.path.splitext(path)
Przykład:
źródło
Inne metody nie usuwają wielu rozszerzeń. Niektóre mają również problemy z nazwami plików, które nie mają rozszerzeń. Ten fragment dotyczy obu instancji i działa zarówno w Pythonie 2, jak i 3. Pobiera basename ze ścieżki, dzieli wartość na kropki i zwraca pierwszą, która jest początkową częścią nazwy pliku.
Oto zestaw przykładów do uruchomienia:
W każdym przypadku drukowana wartość to:
źródło
Path('/path/to/file.txt').stem
. (1,23μs vs 8,39μs)import os
Zwraca to
filename
bezextension
(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)Teraz możesz uzyskać tylko
filename
z temp. Zźródło
Procedura uwzględniająca wiele rozszerzeń. Działa
str
iunicode
ścieżki. Działa w Python 2 i 3.Zachowanie:
źródło
źródło
W systemie Windows użyłem również prefiksu nazwy sterownika, takiego jak:
Ponieważ nie potrzebuję litery dysku ani nazwy katalogu, używam:
źródło
Dla wygody prosta funkcja owijająca dwie metody z
os.path
:Testowane z Python 3.5.
źródło
najprostszym sposobem rozwiązania tego jest
oszczędza to czas i koszty obliczeń.
źródło
Bardzo, bardzo, bardzo prosto, żadnych innych modułów !!!
źródło
Możemy zrobić trochę prostego
split
/pop
magicznego pokazanego tutaj ( https://stackoverflow.com/a/424006/1250044 ), aby wyodrębnić nazwę pliku (uwzględniając różnice między oknami i POSIX).źródło
źródło
import os nazwa pliku, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') nazwa pliku to '/ d1 / d2 / example' file_extension to '.cs'
źródło