Czy jest funkcja do wyodrębnienia rozszerzenia z nazwy pliku?
1296
Czy jest funkcja do wyodrębnienia rozszerzenia z nazwy pliku?
Tak. Użyj os.path.splitext
(patrz dokumentacja Python 2.X lub dokumentacja Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
W przeciwieństwie do większości prób ręcznego dzielenia ciągów, os.path.splitext
będzie poprawnie traktować, /a/b.c/d
że nie ma rozszerzenia zamiast rozszerzenia .c/d
i będzie traktować, .bashrc
że nie ma rozszerzenia zamiast rozszerzenia .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
jest trochę mylące, ponieważos.path.basename("/path/to/somefile.ext")
wróci"somefile.ext"
endswith()
nie być bardziej mobilny i pythonic?.asd
to naprawdę rozszerzenie !! Jeśli się nad tym zastanowić,foo.tar.gz
to plik skompresowany gzip (.gz
), który akurat jest plikiem tar (.tar
). Ale to przede wszystkim plik gzip . Nie spodziewałbym się, że w ogóle zwróci podwójne rozszerzenie.splittext
. Gdyby tylko zrobili coś, co oznaczałoby przerwę między częściami tego imienia, znacznie łatwiej byłoby rozpoznać, że to jestsplitExt
lubsplit_ext
. Z pewnością nie mogę być jedyną osobą, która popełniła ten błąd?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. Nie krępuj się podać rzeczywisty przykład bez odwoływania się do biblioteki innej firmy.źródło
import os.path
zamiastfrom os import path
?from os import path
to nazwapath
zostanie uwzględniona w twoim zasięgu lokalnym, również inni patrząc na kod mogą nie wiedzieć od razu, że ścieżka jest ścieżką z modułu os. Gdzie, tak jakbyśimport os.path
go używał , utrzymuje go wos
przestrzeni nazw i gdziekolwiek wykonujesz połączenie, ludzie natychmiast wiedzą, że pochodzipath()
zos
modułu._, extension = os.path.splitext(filename)
jest znacznie ładniejsza.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Nowości w wersji 3.4.
Dziwię się, nikt nie wspomniano
pathlib
jednak,pathlib
jest niesamowite!Jeśli potrzebujesz wszystkich przyrostków (np. Jeśli masz
.tar.gz
),.suffixes
zwróci ich listę!źródło
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
aby uzyskać tylko .tar.gz.Aby uzyskać tylko tekst rozszerzenia, bez kropki.
źródło
Jedną z opcji może być podział z kropki:
Brak błędu, gdy plik nie ma rozszerzenia:
Ale musisz uważać:
źródło
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
z'file.tar.gz'.split('.')
vs['file.tar', 'gz']
z'file.tar.gz'.rsplit('.', 1)
. tak, może być.warto dodać tam niższą, abyś nie zastanawiał się, dlaczego pliki JPG nie pojawiają się na liście.
źródło
Każde z powyższych rozwiązań działa, ale w systemie Linux odkryłem, że na końcu łańcucha rozszerzenia znajduje się nowa linia, która uniemożliwi pomyślne dopasowanie. Dodaj
strip()
metodę na końcu. Na przykład:źródło
[1:]
w.splittext(filename)[1][1:]
splittext()
(inaczej niż w przypadku podziału łańcucha za pomocą „.”) Zawiera „.” znak w rozszerzeniu. Dodatkowy[1:]
się go pozbywa.Z splitext istnieją problemy z plikami z podwójnym rozszerzeniem (np
file.tar.gz
,file.tar.bz2
itp ..)ale powinno być:
.tar.gz
Możliwe rozwiązania są tutaj
źródło
gunzip somefile.tar.gz
jaka jest nazwa pliku wyjściowego?Możesz znaleźć świetne rzeczy w module pathlib (dostępnym w Pythonie 3.x).
źródło
Chociaż jest to stary temat, ale zastanawiam się, dlaczego w tym przypadku nie wspomina się o bardzo prostym interfejsie API Pythona o nazwie rpartition:
aby uzyskać rozszerzenie ścieżki bezwzględnej dla danego pliku, możesz po prostu wpisać:
przykład:
da ci: „csv”
źródło
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Jeśli nie znaleziono żadnego separator, zwrócony krotka będzie:("", "", "the original string")
.Po prostu
join
wszystkopathlib suffixes
.źródło
Zaskoczony, że jeszcze nie wspomniano:
Korzyści:
Jako funkcja:
źródło
[-1]
tego.Możesz użyć
split
nafilename
:Nie wymaga to dodatkowej biblioteki
źródło
źródło
filename
to zwrócenie ostatniego znaku , jeśli nazwa pliku w ogóle go nie ma.
. Jest tak, ponieważrfind
zwraca,-1
jeśli ciąg nie zostanie znaleziony.Jest to technika bezpośredniej reprezentacji ciągu: widzę wiele wspomnianych rozwiązań, ale myślę, że większość szuka podziału. Podziel jednak robi to przy każdym wystąpieniu „.” . To, czego wolisz, to partycja.
źródło
Inne rozwiązanie z odpowiednim podziałem:
źródło
Nawet na to pytanie już udzielono odpowiedzi, dodałbym rozwiązanie w Regex.
źródło
\.[0-9a-z]+$
jak w tym poście .Prawdziwy jednowarstwowy, jeśli lubisz wyrażenia regularne. I to nie ma znaczenia, nawet jeśli masz dodatkowe „”. pośrodku
Zobacz wynik: Kliknij tutaj
źródło
Jest to najprostsza metoda uzyskania zarówno nazwy pliku, jak i rozszerzenia w jednym wierszu .
W przeciwieństwie do innych rozwiązań, nie musisz zaimportować do tego żadnego pakietu.
źródło
Dla miłośników ... po prostu zbierz rozszerzenia w nagraniu i śledź je wszystkie w folderze. Następnie po prostu wyciągnij odpowiednie rozszerzenia.
źródło
Spróbuj tego:
źródło
foo.tar
jest prawidłową nazwą pliku. Co się stanie, jeśli wyrzucę to na twój kod? Co z.bashrc
lubfoo
? Z tego powodu istnieje funkcja biblioteki ...źródło
źródło
To da ci nazwę pliku do pierwszego „.”, Który byłby najczęstszy.
źródło
file.name.ext