파이썬에서 파일 이름의 확장자를 바꾸거나 제거하는 방법은 무엇입니까?


112

파일 이름의 확장자 (있는 경우)를 대체 (또는 제거)하는 내장 함수가 Python에 있습니까?

예:

print replace_extension('/home/user/somefile.txt', '.jpg')

내 예에서 : /home/user/somefile.txt될 것입니다/home/user/somefile.jpg

중요한지 모르겠지만 작성중인 SCons 모듈에이 정보가 필요합니다. (그래서 내가 사용할 수있는 몇 가지 SCons 특정 기능이 있습니까?)

깨끗한원해요 . 문자열 .txt내에서 발생하는 모든 항목에 대한 간단한 문자열 교체를 수행하는 것은 분명히 깨끗하지 않습니다. (내 파일 이름이이면 실패합니다 somefile.txt.txt.txt)



SCons를 사용하면 작업 문자열에서 파일베이스를 가져올 수 있습니다. 이를 필요로하는 scons 특정 로직을 게시 할 수 있습니까? 액션, 이미 터, 스캐너 용인가요?
bdbaddog

경로가 문자열이 아닌 PosixPath를 반환하므로이 중 일부는 더 이상 작동하지 않는 것 같습니다. : p
shigeta

답변:


146

os.path.splitext를 시도 하면 원하는 작업을 수행 할 수 있습니다.

import os
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'

15
@ S.Lott : 믿거 나 말거나. 그러나 나는했다. 나는 항상한다. 아마도 잘못된 용어 일 것입니다.
ereOn

@ereOn : 귀하의 질문은 거의 똑같은 표현을 사용하기 때문에 귀하가 그것을 찾지 못했다는 것이 조금 놀랍습니다. 질문에 정확히 일치하는 5 개의 단어가 연속으로 있습니다.
S.Lott

새 이름 만 os.path.join과 함께 넣어 깔끔하게 보이도록하십시오.
Tony Veijalainen

4
@Tony Veijalainen : os.path.join은 OS 별 경로 구분 기호로 경로 구성 요소를 연결하기위한 것이므로 os.path.join을 사용하면 안됩니다. 예를 들어 print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')는를 반환 /home/user/somefile/.jpg하지만 바람직하지 않습니다.
scottclowe

@ S.Lott –이 답변을 찬성 한 99 명은이 게시물이 도움이되었으며 모든 대문자를 부끄러워 할 필요가 없음을 의미합니다.
JeffThompson

91

AnaPana의 답변 확장, 방법 확장하여 pathlib를 사용하여 확장 제거 하는 (Python> = 3.4) :

>>> from pathlib import Path

>>> filename = Path('/some/path/somefile.txt')

>>> filename_wo_ext = filename.with_suffix('')

>>> filename_replace_ext = filename.with_suffix('.jpg')

>>> print(filename)
/some/path/somefile.ext    

>>> print(filename_wo_ext)
/some/path/somefile

>>> print(filename_replace_ext)
/some/path/somefile.jpg

1
: 실제 파이썬은 좋은 쓰기 업 pathlib 모듈의 예를 들어, 사용 사례가 realpython.com/python-pathlib
스티븐 C. 하웰

2
이 대답은 일반적인 접근 방식이지만 여러 파일 확장자가 있으면 실패하는 것 같습니다. 예를 들어, pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))출력 것이다 'data/foo.tar.jpg'. 나는 당신이 할 수 있다고 생각 pth.with_suffix('').with_suffix('.jpg')하지만 그것은 투박 하고 파일 확장자에서 .with_suffix('')임의의 점 수를 처리하기 위해 임의의 긴 호출 체인을 추가해야합니다 ( 분명히 .2 개 이상은 이국적인 경우입니다).
전화 :

@tel while루프를 사용 하여 해결할 수 있습니다.pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
dericke

여러 확장 문제에 대한 해결책은 아래 내 대답을 참조하십시오 .
Michael Hall

33

@jethro가 말했듯 splitext이 깔끔한 방법입니다. 그러나이 경우 확장자 마지막 마침표 이후에 오는 파일 이름의 일부 여야 하므로 직접 분할하는 것이 매우 쉽습니다 .

filename = '/home/user/somefile.txt'
print( filename.rsplit( ".", 1 )[ 0 ] )
# '/home/user/somefile'

(가) rsplit문자열의 오른쪽에서 시작하는 문자열 분할을 수행하기 위해 파이썬을 지시하고는 1대부분 하나의 분할에서 수행 말한다 (그래서 예 'foo.bar.baz'-> [ 'foo.bar', 'baz' ]). rsplit항상 비어 있지 않은 배열을 반환 하므로 0확장자를 제외한 파일 이름을 얻기 위해 안전하게 색인화 할 수 있습니다 .


8
를 사용 rsplit하면 점으로 시작하고 다른 확장자가없는 파일에 대해 다른 결과가 발생합니다 (예 : Linux의 숨겨진 파일 .bashrc). os.path.splitext빈 확장자를 반환 rsplit하지만를 사용하면 전체 파일 이름이 확장자로 취급됩니다.
Florian Brucker 2012 년

4
이것은 또한 파일 이름에 대한 예기치 않은 결과를 줄 것이다/home/john.johnson/somefile
윌 맨리에게

7

str.rsplit ()을 사용하는 다음 한 줄짜리 접근 방식을 선호합니다 .

my_filename.rsplit('.', 1)[0] + '.jpg'

예:

>>> my_filename = '/home/user/somefile.txt'
>>> my_filename.rsplit('.', 1)
>>> ['/home/user/somefile', 'txt']

2
somefile에 확장자가없고 사용자가 'john.doe'이면 실패합니다.
Marek Jedliński

그럼 모두 실패하지 않을까요?
eatmeimadanish 2019

6

Python> = 3.4의 경우 :

from pathlib import Path

filename = '/home/user/somefile.txt'

p = Path(filename)
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg')
new_filename_str = str(new_filename) # '/home/user/somefile.jpg'

1
JS가 제안한 pathlib 접근 방식을 생각합니다. 훨씬 간단합니다.
h0b0

4

여러 확장 처리

확장 기능이 여러 개인 경우이 한 줄이 사용 pathlib하고 str.replace작동합니다.

확장 제거 / 제거

>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> str(p).replace("".join(p.suffixes), "")
'/path/to/myfile'

확장 교체

>>> p = Path("/path/to/myfile.tar.gz")
>>> new_ext = ".jpg"
>>> str(p).replace("".join(p.suffixes), new_ext)
'/path/to/myfile.jpg'

pathlib객체 출력 도 원하면 분명히 줄을 줄 바꿈 할 수 있습니다.Path()

>>> Path(str(p).replace("".join(p.suffixes), ""))
PosixPath('/path/to/myfile')

모든 것을 함수로 감싸기

from pathlib import Path
from typing import Union

PathLike = Union[str, Path]


def replace_ext(path: PathLike, new_ext: str = "") -> Path:
    extensions = "".join(Path(path).suffixes)
    return Path(str(p).replace(extensions, new_ext))


p = Path("/path/to/myfile.tar.gz")
new_ext = ".jpg"

assert replace_ext(p, new_ext) == Path('/path/to/myfile.jpg')
assert replace_ext(str(p), new_ext) == Path('/path/to/myfile.jpg')
assert replace_ext(p) == Path('/path/to/myfile')

pathlib에는 이에 대한 바로 가기가 있습니다. Path (). with_suffix ( "")는 확장을 제거하고 Path.with_suffix ( ". txt")가이를 대체합니다.
Levi

옳은. 그러나 첫 번째 확장 만 제거합니다. 따라서 위의 예에서 대신 사용하면 내 대답 대신 제거 만 사용 with_suffix하는 것이 "일반"이되었지만 단일 확장 만 예상하는 경우 더 깨끗한 솔루션이 될 것입니다. replace.gz.tar.gzwith_suffix
Michael Hall

3

또 다른 방법은 str.rpartition(sep)방법 을 사용하는 것입니다.

예를 들면 :

filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')

new_filename = prefix + '.jpg'

print new_filename
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.