파이썬에서 파일 이름에서 확장자 추출


답변:


1989

예. 사용하십시오 os.path.splitext( Python 2.X 설명서 또는 Python 3.X 설명서 참조 ).

>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'

대부분의 수동 문자열 분할 시도와 달리, 확장 대신 확장이없는 것으로 os.path.splitext올바르게 처리 /a/b.c/d하고 확장 대신 확장 이없는 것으로 .c/d취급 .bashrc합니다 .bashrc.

>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')

15
의 사용은 basename여기에 약간 혼란 스러울 os.path.basename("/path/to/somefile.ext")것입니다"somefile.ext"
Jiaaro

17
없는 것 endswith()보다 휴대용 및 파이썬하지?
Sebastian Mach

79
@ klingt.net 그렇다면, .asd그 확장은 정말 확장입니다 !! 생각해 foo.tar.gz보면 gzip 압축 파일 ( .gz)이며 tar 파일 ( .tar)입니다. 그러나 처음 에는 gzip 파일 입니다. 나는 그것이 이중 확장을 전혀 반환하지 않을 것이라고 생각합니다.
nosklo

159
표준 파이썬 함수 명명 규칙은 실제로 성가시다. 거의 이것을 다시 볼 때마다, 나는 그것을 잘못이라고 생각한다 splittext. 그들은 단지이 이름의 부분 사이의 휴식을 의미하는 무엇이든 할 것입니다 경우가 있다고 인식하기가 훨씬 쉬울 것 splitExtsplit_ext. 분명히 내가이 실수를 한 유일한 사람이 될 수 없습니까?
ArtOfWarfare

9
@Vingtoft 귀하는 귀하의 의견에 werkzeug의 FileStorage에 대해 언급하지 않았 으며이 질문은 특정 시나리오에 대해서는 아무것도 없습니다. 파일 이름을 전달하는 방법에 문제가있을 수 있습니다. os.path.splitext('somefile.ext')=> ('somefile', '.ext'). 타사 라이브러리를 참조하지 않고 실제 카운터 예제를 제공하십시오.
Gewthen

400
import os.path
extension = os.path.splitext(filename)[1]

15
호기심에서, 왜 import os.path대신에 from os import path?
kiswa

2
오, 나는 그 뒤에 특별한 이유가 있는지 궁금합니다 (협약 이외). 나는 아직도 파이썬을 배우고 있으며 더 많은 것을 배우고 싶었습니다!
kiswa

55
실제로 사용 from os import path하는 경우 이름 path이 로컬 범위에서 사용되며 코드를 보는 다른 사람들도 경로가 os 모듈의 경로임을 즉시 알 수 없습니다. 마치 마치 사용 import os.path하는 것처럼 os네임 스페이스 내에 유지 하고 전화를 걸면 사람들 path()os모듈 에서 보낸 것임을 즉시 알 수 있습니다.
dennmat

18
나는 그것이 의미 적으로 다르지 않다는 것을 알고 있지만, 개인적으로 건축 _, extension = os.path.splitext(filename)이 훨씬 더 멋지게 보입니다.
Tim Gilbert

3
좀 더 복잡한 표현의 일부로 확장을 원한다면 [1]이 더 유용 할 것입니다. if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
gerardw

238

버전 3.4의 새로운 기능.

import pathlib

print(pathlib.Path('yourPath.example').suffix) # '.example'

pathlib아직 아무도 언급 하지 않은 것이 놀랍습니다 pathlib.

접미사가 모두 필요한 경우 (예 :가있는 경우 .tar.gz) .suffixes해당 목록을 반환합니다.


12
.tar.gz를 얻는 예 :''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
user3780389

좋은 대답입니다. :이 문서보다 더 유용한 튜토리얼 발견 zetcode.com/python/pathlib
user118967을

@ user3780389 "foo.bar.tar.gz"가 여전히 유효한 ".tar.gz"가 아닙니까? 그렇다면 스 니펫은 .suffixes[-2:].tar.gz 만 가져야합니다 .
jeromej

111
import os.path
extension = os.path.splitext(filename)[1][1:]

점없이 확장자의 텍스트 만 가져옵니다.


73

하나의 옵션이 점에서 분리 될 수 있습니다.

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

파일 확장자가 없으면 오류가 없습니다.

>>> "filename".split(".")[-1]
'filename'

그러나 조심해야합니다.

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension

4
x.tar.gz를 업로드하면 화가납니다
Kirill

19
사실 아니다. "x.tar.gz"라는 파일의 확장자는 "tar.gz"가 아닌 "gz"입니다. os.path.splitext는 ".os"도 확장명으로 제공합니다.
Murat Çorlu

1
[-1] 대신 [1]을 사용할 수 있습니다. 나는 이해할 수 없었다 [-1] 분할과
user765443

7
[-1] 점으로 나눈 항목의 마지막 항목을 가져옵니다. 예 :"my.file.name.js".split('.') => ['my','file','name','js]
Murat Çorlu

1
@ BenjaminR 아 좋아, 결과 목록에 대해 최적화하고 있습니다. ['file', 'tar', 'gz']'file.tar.gz'.split('.') ['file.tar', 'gz']'file.tar.gz'.rsplit('.', 1). 그래
Murat Çorlu

40

JPG가 왜 목록에 표시되지 않는지 궁금해하지 않기 위해 더 낮은 값을 추가 할 가치가 있습니다.

os.path.splitext(filename)[1][1:].strip().lower()

19

위의 모든 솔루션이 작동하지만 Linux에서는 확장 문자열 끝에 줄 바꿈이있어 일치하는 것을 막을 수 있습니다. strip()끝에 메소드를 추가하십시오 . 예를 들면 다음과 같습니다.

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 

1
이해를 돕기 위해 두 번째 인덱스 / 슬라이스가 보호하는 추가 동작에 대해 설명해 주시겠습니까? (예 : [1:]in .splittext(filename)[1][1:])-미리 감사드립니다
Samuel Harmer

1
자신을 위해 그것을 알아 냈 : splittext()(당신이 문자열 사용을 분할하는 경우가 달리 '.')을 포함 '.' 확장명의 문자. 추가 [1:]로 제거합니다.
Samuel Harmer

17

splitext 이중 확장자를 가진 파일에 문제가 있습니다 (예를 들어 file.tar.gz, file.tar.bz2등 ..)

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

하지만 다음과 같아야합니다. .tar.gz

가능한 해결책은 다음같습니다


35
아니요. .gz 여야합니다.
Robert Siemer

1
두 개의 확장을 얻으려면 두 번합니까?
maazza 2016 년

1
트윗 담아 가기 gunzip somefile.tar.gz 출력 파일 이름은 무엇입니까?
FlipMcF 2016 년

1
이것이 우리가 확장자 'tgz'를 갖는 이유입니다. tar + gzip! : D
Nuno Aniceto

1
@ peterhil 나는 당신이 파이썬 스크립트가 파일 이름을 만드는 데 사용되는 응용 프로그램을 알고 싶어한다고 생각하지 않습니다. 그것은 질문의 범위를 벗어났습니다. 예를 선택하지 마십시오. 'filename.csv.gz'도 매우 유효합니다.
FlipMcF

16

pathlib 모듈 (python 3.x에서 사용 가능)에서 훌륭한 것들을 찾을 수 있습니다.

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'

14

그것은 오래된 주제이지만, 왜이 경우 rpartition이라는 매우 간단한 파이썬 API가 언급되지 않는지 궁금합니다.

주어진 파일 절대 경로의 확장자를 얻으려면 간단히 다음을 입력하십시오.

filepath.rpartition('.')[-1]

예:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

당신에게 줄 것이다 : 'csv'


1
API에 익숙하지 않은 사용자를 위해 rpartition 은 튜플을 반환합니다 ("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string"). 구분 기호가 없으면 반환 된 튜플은 다음과 같습니다 ("", "", "the original string").
Nickolay

13

그냥 join모두 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'

12

아직 언급되지 않은 것에 놀랐습니다.

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

혜택:

  • 내가 생각할 수있는 모든 것에 대해 예상대로 작동
  • 모듈 없음
  • 정규식 없음
  • 크로스 플랫폼
  • 쉽게 확장 가능 (예 : 확장을위한 선행 점 없음, 확장의 마지막 부분 만)

기능으로 :

def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None

1
파일 확장자가없는 경우 예외가 발생합니다.
thiruvenkadam

4
파일 이름에 많은 포인트가 포함되어 있으면이 답변은 변형을 무시합니다. 예 get_extension ( 'cmocka-1.1.0.tar.xz') => '.1.0.tar.xz'-잘못되었습니다.
PADYMKO

@PADYMKO, IMHO는 파일 이름의 일부로 전체 정지가있는 파일 이름을 만들면 안됩니다. 이 코드는 위의 'tar.xz'결과 안된다
Douwe 반 데르 Leest

2
[-1]그때로 변경하십시오 .
PascalVKooten

11

당신은 사용할 수 있습니다 splitA의를 filename:

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

추가 라이브러리가 필요하지 않습니다


10
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]

2
filename파일 이름이 없으면 마지막 문자 가 반환됩니다 .. 문자열을 찾지 못하면 rfind반환 하기 때문 -1입니다.
mattst

6

이것은 직접적인 문자열 표현 기술입니다. 많은 해결책이 언급되었지만 대부분 분할을 고려하고 있다고 생각합니다. 그러나 "."가 나타날 때마다 분할됩니다. . 오히려 당신이 찾고 싶은 것은 파티션입니다.

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]

2
rpartition 이미 제안 된 @weiyixie .
Nickolay

5

올바른 분할을 가진 또 다른 솔루션 :

# 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

이 질문조차 이미 Regex에 솔루션을 추가 할 것입니다.

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'

1
또는 이 게시물\.[0-9a-z]+$ 에서와 같이 .
폴트

2

정규식을 좋아한다면 진정한 한 라이너. 추가 "."가 있어도 중요하지 않습니다. 중간에

import re

file_ext = re.search(r"\.([^.]+)$", filename).group(1)

결과는 여기를 참조하십시오 : 여기를 클릭하십시오


0

이것은 한 줄로 파일 이름과 확장자를 모두 얻는 가장 간단한 방법 입니다.

fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')

>>> print(fName)
Flower
>>> print(ext)
jpeg

다른 솔루션과 달리이를 위해 패키지를 가져올 필요는 없습니다.


2
예를 들어 'archive.tar.gz
studioj

0

funsies의 경우 ... 단지 dict에서 확장을 수집하고 폴더에서 모든 확장을 추적하십시오. 그런 다음 원하는 확장을 당기십시오.

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

이 시도:

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. 목록 안에 모든 파일 이름을 가져옵니다
  2. 파일 이름을 나누고 penultimate 확장명을 확인하십시오. pen_ext 목록에 있습니까?
  3. 그렇다면 마지막 확장자로 결합하여 파일 확장자로 설정하십시오.
  4. 그렇지 않으면 마지막 확장자를 파일 확장자로 넣으십시오.
  5. 그런 다음 확인하십시오

1
이것은 특별한 경우가 많습니다. 허용 된 답변을 참조하십시오. 그것은 단지 버그가있는 방식으로 바퀴를 재창조하고 있습니다.
Robert

나는 내 답변을 업데이트
Ibnul Husainan

여보세요! 이 코드가 문제를 해결하는 방법과 이유에 대한 설명포함 하여 질문을 해결할 수는 있지만 게시물의 품질을 향상시키는 데 도움이되고 더 많은 투표를 할 수 있습니다. 지금 질문하는 사람이 아니라 독자들에게 질문에 대답하고 있음을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
브라이언

@ 브라이언 같은가요?
Ibnul Husainan

당신은 그것을 악화시키고 새로운 방식으로 파괴하고 있습니다. foo.tar유효한 파일 이름입니다. 코드에서 던지면 어떻게됩니까? 무엇에 대해 .bashrcfoo? 이런 이유로 라이브러리 기능이 있습니다 ...
Robert

-2
# 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 ""

-3
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

-5
name_only=file_name[:filename.index(".")

그러면 가장 일반적인 첫 번째 "."까지 파일 이름이 제공됩니다.


1
첫째, 그는 이름이 아니라 확장명을 필요로합니다. 둘째, 이름이 필요하더라도 다음과 같은 파일에 의해 잘못 될 수 있습니다.file.name.ext
ya_dimon

@ya_dimon에서 언급했듯이 점이있는 파일 이름에는 작동하지 않습니다. 또한 그는 확장이 필요합니다!
Umar Dastgir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.