Odpowiedzi:
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', '')
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 jest splitExt
lub split_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.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
zamiast from os import path
?
from os import path
to nazwa path
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 w os
przestrzeni nazw i gdziekolwiek wykonujesz połączenie, ludzie natychmiast wiedzą, że pochodzi path()
z os
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.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
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ę!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
aby uzyskać tylko .tar.gz.
Jedną z opcji może być podział z kropki:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Brak błędu, gdy plik nie ma rozszerzenia:
>>> "filename".split(".")[-1]
'filename'
Ale musisz uważać:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"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ć.
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:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[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 ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
ale powinno być: .tar.gz
Możliwe rozwiązania są tutaj
gunzip somefile.tar.gz
jaka jest nazwa pliku wyjściowego?
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ć:
filepath.rpartition('.')[-1]
przykład:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
da ci: „csv”
("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")
.
Zaskoczony, że jeszcze nie wspomniano:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
Korzyści:
Jako funkcja:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
tego.
Możesz użyć split
na filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Nie wymaga to dodatkowej biblioteki
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
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.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Inne rozwiązanie z odpowiednim podziałem:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
Nawet na to pytanie już udzielono odpowiedzi, dodałbym rozwiązanie w Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
\.[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
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Zobacz wynik: Kliknij tutaj
Jest to najprostsza metoda uzyskania zarówno nazwy pliku, jak i rozszerzenia w jednym wierszu .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
W przeciwieństwie do innych rozwiązań, nie musisz zaimportować do tego żadnego pakietu.
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.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
Spróbuj tego:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
jest prawidłową nazwą pliku. Co się stanie, jeśli wyrzucę to na twój kod? Co z .bashrc
lub foo
? Z tego powodu istnieje funkcja biblioteki ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
To da ci nazwę pliku do pierwszego „.”, Który byłby najczęstszy.
file.name.ext
basename
jest trochę mylące, ponieważos.path.basename("/path/to/somefile.ext")
wróci"somefile.ext"