web-dev-qa-db-ja.com

Pythonでfilenameから拡張子を抽出する

ファイル名から拡張子を抽出する機能はありますか?

1044
Alex

はい。 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', '')
1628
nosklo
import os.path
extension = os.path.splitext(filename)[1]
349
Brian Neal

バージョン3.4の新機能。

import pathlib

print(pathlib.Path('yourPathGoesHere').suffix)

pathlib まだpathlib ISすごいと言っている人はいません。

あなたがすべての接尾辞を必要とするなら(例えば、あなたが.tar.gzを持っているなら)、.suffixesはそれらのリストを返すでしょう!

134
JeromeJ
import os.path
extension = os.path.splitext(filename)[1][1:]

ドットを除いて、拡張子のテキストだけを取得します。

94
wonzbak

1つの選択肢は、ドットから分割することです。

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

ファイルに拡張子が付いていなくてもエラーなし:

>>> "filename".split(".")[-1]
'filename'

しかし、注意が必要です。

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension
63
Murat Çorlu

jPGがなぜリストに表示されないのか疑問に思わないように、そこに低い値を追加する価値があります。

os.path.splitext(filename)[1][1:].strip().lower()
32
blented

上記の解決策のいずれでも動作しますが、Linuxでは、拡張文字列の最後に改行があり、一致が成功しないようにします。最後にstrip()メソッドを追加してください。例えば:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 
14
yamex5

分割テキストでは、二重拡張子を持つファイルに問題があります(例:file.tar.gzfile.tar.bz2など)。

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

.tar.gz

可能な解決策は ここ

13
XavierCLL

それは古い話題ですが、この場合rpartitionと呼ばれる非常に単純なpythonのapiを言及していないのはなぜでしょうか。

与えられたファイルの絶対パスの拡張子を取得するには、単に入力することができます:

filepath.rpartition('.')[-1]

例:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

あなたを与えるでしょう: 'csv'

10
weiyixie

驚いたことにこれはまだ言及されていません:

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
8
PascalVKooten
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
8
staytime

あなたはpathlibモジュールにいくつかの素晴らしいものを見つけることができます。

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'
7
Tit Poplatnik

splitfilenameを使用できます。

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

これは追加のライブラリを必要としません

6
soheshdoshi

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'
5
Alex

これは直接的な文字列表現のテクニックです:私はたくさんの解決策を述べましたが、私はほとんどが分割を見ていると思います。しかし分割は "。"が現れるたびに行います。 。あなたがむしろ探しているものはパーティションです。

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
4
Kenstars

この質問でさえすでに答えられていますが、私はRegexに解決策を追加したいと思います。

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
3
Micha

右分割によるもう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])