Wyodrębnianie rozszerzenia z nazwy pliku w Pythonie
Czy istnieje funkcja do wyodrębniania rozszerzenia z nazwy pliku?
24 answers
Tak. Użyj os.path.splitext
(patrz Python 2.Dokumentacja X lub Python 3.Dokumentacja 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 ręcznych prób dzielenia łańcuchów, os.path.splitext
będzie poprawnie traktować /a/b.c/d
jako nie posiadające rozszerzenia zamiast mieć rozszerzenie .c/d
, i będzie traktować .bashrc
jako nie posiadające rozszerzenia zamiast mieć rozszerzenie .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-15 20:00:05
import os.path
extension = os.path.splitext(filename)[1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 14:15:07
nowość w wersji 3.4.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
Dziwi mnie, że nikt nie wspomniał pathlib
A jednak, pathlib
jest super!
Jeśli potrzebujesz wszystkich przyrostków (np. jeśli masz .tar.gz
), .suffixes
zwróci ich listę!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-13 13:09:44
import os.path
extension = os.path.splitext(filename)[1][1:]
Aby uzyskać tylko tekst rozszerzenia, bez kropki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-10 14:16:38
Dla prostych przypadków użycia jedną z opcji może być rozdzielenie od kropki:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Brak błędu, gdy plik nie ma rozszerzenia:
>>> "filename".split(".")[-1]
'filename'
Ale musisz być ostrożny:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
Również nie będzie działać z ukrytymi plikami w systemach uniksowych:
>>> ".bashrc".split(".")[-1]
'bashrc' # But this is not an extension
Do użytku ogólnego, preferuj os.path.splitext
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-16 10:11:40
Warto dodać niżej, aby nie zastanawiać się, dlaczego pliki JPG nie pojawiają się na twojej liście.
os.path.splitext(filename)[1][1:].strip().lower()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-28 07:25:49
Każde z powyższych rozwiązań działa, ale na Linuksie odkryłem, że na końcu łańcucha rozszerzenia znajduje się nowy wiersz, który uniemożliwi dopasowanie. Dodaj metodę strip()
na końcu. Na przykład:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 05:45:26
Możesz znaleźć kilka świetnych rzeczy w module pathlib (dostępnym w Pythonie 3.x).
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)
# Output
'.txt'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-04 15:11:10
W Splitext występują problemy z plikami z podwójnym rozszerzeniem (np. file.tar.gz
, file.tar.bz2
, itd..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
Ale powinno być: .tar.gz
Możliwe rozwiązania to tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59
Chociaż jest to stary temat, ale zastanawiam się, dlaczego nie ma wzmianki o bardzo prostym api Pythona o nazwie rpartition w tym przypadku:
Aby uzyskać rozszerzenie podanej ścieżki bezwzględnej pliku, wystarczy wpisać:
filepath.rpartition('.')[-1]
Przykład:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
Da ci: 'csv'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-27 03:53:05
Po Prostu join
wszystkie pathlib suffixes
.
>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-12 15:05:56
Dziwne, że jeszcze o tym 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:
- działa zgodnie z oczekiwaniami na wszystko, co przychodzi mi do głowy
- Brak modułów
- No regex
- Cross-platform
- łatwo rozszerzalny (np. brak kropek prowadzących do rozszerzenia, tylko ostatnia część rozszerzenia)
Jako funkcja:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-20 00:30:54
Możesz użyć split
na filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
To nie wymaga dodatkowej biblioteki
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 18:59:16
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 10:55:57
Jest to bezpośrednia reprezentacja ciągów znaków : Widzę wiele rozwiązań wymienionych, ale myślę, że większość patrzy na split. Split jednak robi to przy każdym wystąpieniu"." . To, czego wolisz szukać, to partycja.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 11:06:25
Inne rozwiązanie z prawym 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])
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-03 07:42:26
Nawet to pytanie jest już odpowiedział dodałbym rozwiązanie w Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 08:42:15
True one-liner, jeśli lubisz regex. I nie ma znaczenia, nawet jeśli masz dodatkowe"."w środku
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Zobacz tutaj, aby uzyskać wynik: Kliknij tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-09 08:44:40
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
- pobierz Wszystkie nazwy pliku z listy
- dzielenie nazwy pliku i sprawdzanie przedostatniego rozszerzenia, czy jest na liście pen_ext czy nie?
- Jeśli tak, połącz go z ostatnim rozszerzeniem i ustaw jako rozszerzenie pliku
- if not then just put the last extension as the file ' s extension
- a następnie sprawdź to
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-21 23:11:19
Dla Zabawy... po prostu Zbierz rozszerzenia w dict i śledź je wszystkie w folderze. Następnie po prostu pociągnij żądane 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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-14 16:42:59
# 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 ""
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 13:53:03
Jest to najprostsza metoda , aby uzyskać zarówno nazwę pliku, jak i rozszerzenie w pojedynczej linii .
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 importować żadnego pakietu do tego celu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-04 10:07:17
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-06 20:28:41
name_only=file_name[:filename.index(".")
To da Ci nazwę pliku aż do pierwszego ".", który byłby najczęściej spotykany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-08 19:18:40