web-dev-qa-db-ja.com

Pythonでファイル名から拡張子を置き換える(または取り除く)方法は?

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の場合、これは失敗します)

81
ereOn

os.path.splitext を試してください。

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

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
47
JS.

@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を入力して、ファイル名から拡張子を除いたものを取得します。

27
Katriel

str.rsplit() を使用する次のワンライナーアプローチを好みます。

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

例:

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

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'
2
AnaPana

もう1つの方法は、 str.rpartition(sep) メソッドを使用することです。

例えば:

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

new_filename = prefix + '.jpg'

print new_filename
2
user2802945

複数の拡張機能の処理

複数の拡張機能がある場合、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')
_
0
Michael Hall