Wyodrębnianie rozszerzenia z nazwy pliku w Pythonie

Czy istnieje funkcja do wyodrębniania rozszerzenia z nazwy pliku?

Author: kkurian, 2009-02-12

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', '')
 2170
Author: nosklo,
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]
 427
Author: Brian Neal,
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ę!

 309
Author: jeromej,
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.

 120
Author: wonzbak,
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

 77
Author: Murat Çorlu,
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()
 40
Author: blented,
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() 
 19
Author: yamex5,
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'
 18
Author: r3t40,
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

 17
Author: XavierCLL,
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'

 15
Author: weiyixie,
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'
 15
Author: Alex,
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
 11
Author: PascalVKooten,
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

 11
Author: soheshdoshi,
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('.'):]
 10
Author: staytime,
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]
 6
Author: Kenstars,
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])
 5
Author: Arnaldo P. Figueira Figueira,
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'
 5
Author: Micha,
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

 2
Author: Victor Wang,
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
  1. pobierz Wszystkie nazwy pliku z listy
  2. dzielenie nazwy pliku i sprawdzanie przedostatniego rozszerzenia, czy jest na liście pen_ext czy nie?
  3. Jeśli tak, połącz go z ostatnim rozszerzeniem i ustaw jako rozszerzenie pliku
  4. if not then just put the last extension as the file ' s extension
  5. a następnie sprawdź to
 1
Author: Ibnul Husainan,
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)
 0
Author: eatmeimadanish,
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 ""
 -2
Author: DragonX,
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.

 -2
Author: Ripon Kumar Saha,
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
 -3
Author: user5535053,
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.

 -5
Author: wookie,
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