개발/Python

[파이썬] 파일 이름에서 확장자 추출하는 방법

MinorMan 2023. 8. 11. 19:30
반응형

<질문>

파일명에서 확장자를 추출하는 기능이 있나요?


<답변1>

사용os.path.splitext:

>>> 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', '')

<답변2>

버전 3.4의 새로운 기능.

import pathlib

print(pathlib.Path('yourPath.example').suffix) # '.example'
print(pathlib.Path("hello/foo.bar.tar.gz").suffixes) # ['.bar', '.tar', '.gz']
print(pathlib.Path('/foo/bar.txt').stem) # 'bar'

아무도 언급하지 않은 것에 놀랐습니다.pathlib아직,pathlib굉장해!


<답변3>

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

<답변4>

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

점 없이 확장의 텍스트만 가져오려면.


<답변5>

간단한 사용 사례의 경우 하나의 옵션이 점에서 분리될 수 있습니다.

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

파일에 확장자가 없을 때 오류 없음:

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

그러나 주의해야 합니다.

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

또한 Unix 시스템의 숨겨진 파일에서는 작동하지 않습니다.

>>> ".bashrc".split(".")[-1]
'bashrc'    # But this is not an extension

일반적인 사용을 위해, 선호하십시오os.path.splitext


<답변6>

거기에 더 낮은 값을 추가할 가치가 있으므로 JPG가 목록에 표시되지 않는 이유를 궁금해하지 마십시오.

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

<답변7>

위의 모든 솔루션이 작동하지만 Linux에서는 일치가 성공하지 못하도록 하는 확장 문자열 끝에 줄 바꿈이 있음을 발견했습니다. 추가strip()방법을 끝까지. 예를 들어:

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

<답변8>

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

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

그러나 다음과 같아야 합니다..tar.gz

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


<답변9>

pathlib 모듈(python 3.x에서 사용 가능)에서 몇 가지 유용한 정보를 찾을 수 있습니다.

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

# Output 
'.txt'

<답변10>

단지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'

<답변11>

오래된 주제이지만 이 경우 rpartition이라는 매우 간단한 파이썬 API를 언급하지 않는 이유가 궁금합니다.

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

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

예:

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

줄 것입니다: 'csv'


<답변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

<답변13>

당신은 사용할 수 있습니다splitfilename:

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

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


<답변14>

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

<답변15>

분할 텍스트()함수는 파일 경로를 루트와 확장자의 두 값을 갖는 튜플로 분할합니다.

import os
# unpacking the tuple
file_name, file_extension = os.path.splitext("/Users/Username/abc.txt")
print(file_name)
print(file_extension)

파일 확장자를 얻기 위한 Pathlib 모듈

import pathlib
pathlib.Path("/Users/pankaj/abc.txt").suffix
#output:'.txt'

<답변16>

이 질문에도 이미 답변이 있습니다. Regex에 솔루션을 추가하겠습니다.

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

<답변17>

이것은 직접적인 문자열 표현 기술입니다. 많은 솔루션이 언급되었지만 대부분 분할을 보고 있는 것 같습니다. 그러나 Split은 "."가 나타날 때마다 수행합니다. . 오히려 찾고 싶은 것은 파티션입니다.

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

<답변18>

오른쪽 분할이 있는 다른 솔루션:

# 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])

<답변19>

다음 코드를 사용하여 파일 이름과 확장자를 분할할 수 있습니다.

    import os.path
    filenamewithext = os.path.basename(filepath)
    filename, ext = os.path.splitext(filenamewithext)
    #print file name
    print(filename)
    #print file extension
    print(ext)

<답변20>

정규식을 좋아한다면 진정한 한 줄입니다. 그리고 추가 "."가 있더라도 상관 없습니다. 중간에

import re

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

결과는 여기를 참조하십시오.Click Here


<답변21>

당신이 사용할 수있는로 끝나다파이썬에서 파일 확장자를 식별하려면

다음과 같은 예

for file in os.listdir():
    if file.endswith('.csv'):
        df1 =pd.read_csv(file)
        frames.append(df1)
        result = pd.concat(frames)

<답변22>

음, 내가 늦었다는 걸 알아

그게 내 간단한 해결책이야

file = '/foo/bar/whatever.ext'
extension = file.split('.')[-1]
print(extension)

#output will be ext

<답변23>

이 시도:

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. 파일 이름을 분할하고 끝에서 두 번째 확장자를 확인하십시오. pen_ext 목록에 있습니까?
  3. 그렇다면 마지막 확장자와 연결하고 파일의 확장자로 설정하십시오.
  4. 그렇지 않은 경우 마지막 확장자를 파일 확장자로 넣으십시오.
  5. 그런 다음 확인하십시오

<답변24>

얻는 가장 쉬운 방법은 사용하는 것입니다.mimtypes, 아래는 예입니다.

import mimetypes

mt = mimetypes.guess_type("file name")
file_extension =  mt[0]
print(file_extension)

<답변25>

나는 확실히 파티에 늦었지만 누군가가 다른 라이브러리를 사용하지 않고 이것을 달성하기를 원하는 경우를 대비하여:

file_path = "example_tar.tar.gz"
file_name, file_ext = [file_path if "." not in file_path else file_path.split(".")[0], "" if "." not in file_path else file_path[file_path.find(".") + 1:]]
print(file_name, file_ext)

두 번째 줄은 기본적으로 다음 코드이지만 한 줄로 채워져 있습니다.

def name_and_ext(file_path):
    if "." not in file_path:
        file_name = file_path
    else:
        file_name = file_path.split(".")[0]
    if "." not in file_path:
        file_ext = ""
    else:
        file_ext = file_path[file_path.find(".") + 1:]
    return [file_name, file_ext]

이것이 작동하더라도 모든 유형의 파일, 특히 작동하지 않을 수 있습니다..zshrc, 나는 사용을 권장합니다os'에스os.path.splitext기능, 아래 예:

import os
file_path = "example.tar.gz"
file_name, file_ext = os.path.splitext(file_path)
print(file_name, file_ext)

건배 :)


<답변26>

재미를 위해 ... 확장명을 사전에 수집하고 폴더에서 모두 추적하십시오. 그런 다음 원하는 확장 프로그램을 끌어오세요.

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)

<답변27>

이 방법에는 사전, 목록 또는 집합이 필요합니다. 내장 문자열 메서드를 사용하여 ".endswith"를 사용할 수 있습니다. 이렇게 하면 파일 끝의 목록에서 이름을 검색하고 다음과 같이 수행할 수 있습니다.str.endswith(fileName[index]). 이것은 확장을 가져오고 비교하기 위한 것입니다.

https://docs.python.org/3/library/stdtypes.html#string-methods

예 1:

dictonary = {0:".tar.gz", 1:".txt", 2:".exe", 3:".js", 4:".java", 5:".python", 6:".ruby",7:".c", 8:".bash", 9:".ps1", 10:".html", 11:".html5", 12:".css", 13:".json", 14:".abc"} 
for x in dictonary.values():
    str = "file" + x
    str.endswith(x, str.index("."), len(str))

예 2:

set1 = {".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"}
for x in set1:
   str = "file" + x
   str.endswith(x, str.index("."), len(str))

예 3:

fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"];
for x in range(0, len(fileName)):
    str = "file" + fileName[x]
    str.endswith(fileName[x], str.index("."), len(str))

예 4

fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"];
str = "file.txt"
str.endswith(fileName[1], str.index("."), len(str))

출력이 있는 예 5, 6, 7enter image description here

실시예 8

fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"];
exts = []
str = "file.txt"
for x in range(0, len(x)):
    if str.endswith(fileName[1]) == 1:
         exts += [x]
     

<답변28>

여기에서 마지막 파일 확장자가 여러 개인 경우 추출하려면

class functions:
    def listdir(self, filepath):
        return os.listdir(filepath)
    
func = functions()

os.chdir("C:\\Users\Asus-pc\Downloads") #absolute path, change this to your directory
current_dir = os.getcwd()

for i in range(len(func.listdir(current_dir))): #i is set to numbers of files and directories on path directory
    if os.path.isfile((func.listdir(current_dir))[i]): #check if it is a file
        fileName = func.listdir(current_dir)[i] #put the current filename into a variable
        rev_fileName = fileName[::-1] #reverse the filename
        currentFileExtension = rev_fileName[:rev_fileName.index('.')][::-1] #extract from beginning until before .
        print(currentFileExtension) #output can be mp3,pdf,ini,exe, depends on the file on your absolute directory

출력은 mp3이며 확장자 이름이 1개뿐인 경우에도 작동합니다.


<답변29>

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

<답변30>

a = ".bashrc"
b = "text.txt"
extension_a = a.split(".")
extension_b = b.split(".")
print(extension_a[-1])  # bashrc
print(extension_b[-1])  # txt
반응형