파일 이름의 확장자 (있는 경우)를 대체 (또는 제거)하는 내장 함수가 Python에 있습니까?
예:
print replace_extension('/home/user/somefile.txt', '.jpg')
내 예에서 : /home/user/somefile.txt
될 것입니다/home/user/somefile.jpg
중요한지 모르겠지만 작성중인 SCons 모듈에이 정보가 필요합니다. (그래서 내가 사용할 수있는 몇 가지 SCons 특정 기능이 있습니까?)
깨끗한 걸 원해요 . 문자열 .txt
내에서 발생하는 모든 항목에 대한 간단한 문자열 교체를 수행하는 것은 분명히 깨끗하지 않습니다. (내 파일 이름이이면 실패합니다 somefile.txt.txt.txt
)
답변
os.path.splitext를 시도 하면 원하는 작업을 수행 할 수 있습니다.
import os
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'
답변
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
답변
@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
확장자를 제외한 파일 이름을 얻기 위해 안전하게 색인화 할 수 있습니다 .
답변
str.rsplit ()을 사용하는 다음 한 줄짜리 접근 방식을 선호합니다 .
my_filename.rsplit('.', 1)[0] + '.jpg'
예:
>>> my_filename = '/home/user/somefile.txt'
>>> my_filename.rsplit('.', 1)
>>> ['/home/user/somefile', 'txt']
답변
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'
답변
여러 확장 처리
확장 기능이 여러 개인 경우이 한 줄이 사용 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')
답변
또 다른 방법은 str.rpartition(sep)
방법 을 사용하는 것입니다.
예를 들면 :
filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')
new_filename = prefix + '.jpg'
print new_filename