Czy w Pythonie jest funkcja wbudowana, która zastąpiłaby (lub usunęłaby cokolwiek) rozszerzenie nazwy pliku (jeśli takie ma)?
Przykład:
print replace_extension('/home/user/somefile.txt', '.jpg')
W moim przykładzie: /home/user/somefile.txt
stałoby się/home/user/somefile.jpg
Nie wiem, czy to ma znaczenie, ale potrzebuję tego dla modułu SCons, który piszę. (Więc może jest jakaś specyficzna funkcja SCons, której mogę użyć?)
Chciałbym coś czystego . Wykonanie prostej zamiany ciągu wszystkich wystąpień .txt
w ciągu nie jest oczywiście czyste. (To się nie powiedzie, jeśli moja nazwa pliku to somefile.txt.txt.txt
)
Odpowiedzi:
Wypróbuj os.path.splitext , powinien zrobić to, co chcesz.
źródło
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
zwróci/home/user/somefile/.jpg
, co nie jest pożądane.Rozwijając odpowiedź AnaPana, jak usunąć rozszerzenie za pomocą pathlib (Python> = 3.4):
źródło
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
wyświetli'data/foo.tar.jpg'
. Przypuszczam, że możesz to zrobićpth.with_suffix('').with_suffix('.jpg')
, ale jest to niezgrabne i musiałbyś dodać dowolnie długi łańcuch.with_suffix('')
wywołań, aby poradzić sobie z dowolną liczbą kropek.
w rozszerzeniu pliku ( trzeba przyznać, że więcej niż 2 to egzotyczny przypadek krawędzi).while
pętli, aby rozwiązać ten problem:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Jak powiedział @jethro,
splitext
jest to zgrabny sposób na zrobienie tego. Ale w tym przypadku dość łatwo jest to podzielić samodzielnie, ponieważ rozszerzenie musi być częścią nazwy pliku znajdującą się po ostatnim okresie:rsplit
Mówi Python wykonać szpagat ciągów zaczynając od prawej strony napisu, a1
mówi się wykonywać co najwyżej jeden split (tak że np'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Ponieważrsplit
zawsze zwróci niepustą tablicę, możemy bezpiecznie zindeksować0
do niej, aby uzyskać nazwę pliku bez rozszerzenia.źródło
rsplit
spowoduje różne wyniki dla plików, które zaczynają się od kropki i nie mają innego rozszerzenia (jak np.bashrc
. Pliki ukryte w Linuksie ).os.path.splitext
zwraca dla nich puste rozszerzenie, ale użyciersplit
potraktuje całą nazwę pliku jako rozszerzenie./home/john.johnson/somefile
Preferuję następujące jednoliniowe podejście przy użyciu str.rsplit () :
Przykład:
źródło
Dla Pythona> = 3.4:
źródło
Obsługa wielu rozszerzeń
W przypadku, gdy masz wiele rozszerzeń, ta jedna linijka używa
pathlib
istr.replace
działa:Usuń / zdejmij rozszerzenia
Wymień rozszerzenia
Jeśli chcesz również uzyskać
pathlib
obiekt wyjściowy, możesz oczywiście zawinąć linięPath()
Zawijanie tego wszystkiego w funkcję
źródło
with_suffix
zamiastreplace
usuwałoby tylko.gz
zamiast..tar.gz
Moja odpowiedź miała być „ogólna”, ale jeśli spodziewasz się tylko jednego rozszerzenia,with_suffix
byłoby czystszym rozwiązaniem.Innym sposobem jest użycie
str.rpartition(sep)
metody.Na przykład:
źródło