ファイル名から拡張子を抽出する機能はありますか?
はい。 os.path.splitext
を使用してください( Python 2.Xドキュメント または Python 3.Xドキュメント を参照)。
>>> 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', '')
import os.path
extension = os.path.splitext(filename)[1]
バージョン3.4の新機能。
import pathlib
print(pathlib.Path('yourPathGoesHere').suffix)
pathlib
まだpathlib
ISすごいと言っている人はいません。
あなたがすべての接尾辞を必要とするなら(例えば、あなたが.tar.gz
を持っているなら)、.suffixes
はそれらのリストを返すでしょう!
import os.path
extension = os.path.splitext(filename)[1][1:]
ドットを除いて、拡張子のテキストだけを取得します。
1つの選択肢は、ドットから分割することです。
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
ファイルに拡張子が付いていなくてもエラーなし:
>>> "filename".split(".")[-1]
'filename'
しかし、注意が必要です。
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
jPGがなぜリストに表示されないのか疑問に思わないように、そこに低い値を追加する価値があります。
os.path.splitext(filename)[1][1:].strip().lower()
上記の解決策のいずれでも動作しますが、Linuxでは、拡張文字列の最後に改行があり、一致が成功しないようにします。最後にstrip()
メソッドを追加してください。例えば:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
分割テキストでは、二重拡張子を持つファイルに問題があります(例:file.tar.gz
、file.tar.bz2
など)。
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
.tar.gz
可能な解決策は ここ
それは古い話題ですが、この場合rpartitionと呼ばれる非常に単純なpythonのapiを言及していないのはなぜでしょうか。
与えられたファイルの絶対パスの拡張子を取得するには、単に入力することができます:
filepath.rpartition('.')[-1]
例:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
あなたを与えるでしょう: 'csv'
驚いたことにこれはまだ言及されていません:
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
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
あなたはpathlibモジュールにいくつかの素晴らしいものを見つけることができます。
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)
# Output
'.txt'
split
にfilename
を使用できます。
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
これは追加のライブラリを必要としません
join
all 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'
これは直接的な文字列表現のテクニックです:私はたくさんの解決策を述べましたが、私はほとんどが分割を見ていると思います。しかし分割は "。"が現れるたびに行います。 。あなたがむしろ探しているものはパーティションです。
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
この質問でさえすでに答えられていますが、私はRegexに解決策を追加したいと思います。
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
右分割によるもう1つの解決策:
# 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])