Pythonに、ファイル名の拡張子(ある場合)を置換(または削除)する組み込み関数がありますか?
例:
print replace_extension('/home/user/somefile.txt', '.jpg')
私の例では:/home/user/somefile.txt
は/home/user/somefile.jpg
になります
それが重要かどうかはわかりませんが、私が書いているSConsモジュールにはこれが必要です。 (だからおそらく私が使用できるSCons固有の機能があるのでしょうか?)
何か欲しいclean。文字列内の.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)を使用して拡張機能をremoveする方法:
>>> 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
はそれを行うきちんとした方法です。しかし、この場合、拡張子must beは最後のピリオドの後にくるファイル名の部分なので、自分で分割するのは非常に簡単です。
filename = '/home/user/somefile.txt'
print( filename.rsplit( ".", 1 )[ 0 ] )
# '/home/user/somefile'
rsplit
は、Pythonに、文字列の右から始まる文字列分割を実行するよう指示し、1
は、最大で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'
もう1つの方法は、 str.rpartition(sep)
メソッドを使用することです。
例えば:
filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')
new_filename = prefix + '.jpg'
print new_filename
複数の拡張機能がある場合、pathlib
と_str.replace
_を使用するこの1行のライナーは、次のように機能します。
_>>> 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')
_