1624

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

4

27 に答える 27

2405

はい。使用します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'

ほとんどの手動の文字列分割試行とは異なり、はextension を持つ代わりに拡張子なしとしてos.path.splitext正しく扱い、 extension を持つ代わりに拡張子なしとして扱います:/a/b.c/d.c/d.bashrc.bashrc

>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
于 2009-02-12T14:12:46.010 に答える
469
import os.path
extension = os.path.splitext(filename)[1]
于 2009-02-12T14:15:07.893 に答える
456

バージョン 3.4 の新機能。

import pathlib

print(pathlib.Path('yourPath.example').suffix) # '.example'

誰もpathlibまだ言及していないことに驚いていpathlibます。

すべてのサフィックスが必要な場合 (たとえば、 がある場合.tar.gz) は.suffixes、それらのリストを返します!

于 2016-02-03T21:41:25.727 に答える
134
import os.path
extension = os.path.splitext(filename)[1][1:]

ドットなしで拡張子のテキストのみを取得します。

于 2011-08-26T09:37:47.917 に答える
99

単純な使用例では、1 つのオプションがドットから分割される場合があります。

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

ファイルに拡張子がない場合、エラーは発生しません:

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

ただし、次の点に注意する必要があります。

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

また、Unix システムの隠しファイルでは機能しません。

>>> ".bashrc".split(".")[-1]
'bashrc'    # But this is not an extension

一般的な使用のために、好むos.path.splitext

于 2012-04-09T18:48:16.173 に答える
42

JPG がリストに表示されない理由を疑問に思わないように、下に追加する価値があります。

os.path.splitext(filename)[1][1:].strip().lower()
于 2012-12-28T07:25:49.757 に答える
21

上記の解決策はどれも機能しますが、Linux では、拡張文字列の最後に改行があり、一致が成功しないことがわかりました。strip()メソッドを最後に追加します。例えば:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 
于 2011-10-10T22:48:43.463 に答える
20

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

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

ただし、次のようにする必要があります。.tar.gz

考えられる解決策はこちら

于 2013-02-05T00:19:54.070 に答える
15

古いトピックですが、この場合、rpartition と呼ばれる非常に単純な python の API について言及していないのはなぜでしょうか。

特定のファイルの絶対パスの拡張子を取得するには、次のように入力するだけです。

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

例:

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

あなたに与えるでしょう:「csv」

于 2017-02-27T03:53:05.390 に答える
11

これがまだ言及されていないことに驚いた:

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
于 2015-12-20T00:24:08.017 に答える
10
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
于 2014-02-18T10:55:57.560 に答える
6

これは直接的な文字列表現のテクニックです: 多くの解決策が言及されていますが、ほとんどは分割を見ていると思います。ただし、分割は「。」が出現するたびに行われます。. あなたが探しているのはパーティションです。

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
于 2018-04-18T11:06:25.417 に答える
5

右分割による別のソリューション:

# 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])
于 2014-01-03T07:32:02.133 に答える
0

ファンシーの場合...拡張機能を辞書に収集し、それらすべてをフォルダー内で追跡します。次に、必要な拡張機能を引っ張るだけです。

import os

search = {}

for f in os.listdir(os.getcwd()):
    fn, fe = os.path.splitext(f)
    try:
        search[fe].append(f)
    except:
        search[fe]=[f,]

extensions = ('.png','.jpg')
for ex in extensions:
    found = search.get(ex,'')
    if found:
        print(found)
于 2020-02-14T16:42:59.273 に答える
-2
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs

import os.path

class LinkChecker:

    @staticmethod
    def get_link_extension(link: str)->str:
        if link is None or link == "":
            return ""
        else:
            paths = os.path.splitext(link)
            ext = paths[1]
            new_link = paths[0]
            if ext != "":
                return LinkChecker.get_link_extension(new_link) + ext
            else:
                return ""
于 2015-04-01T16:56:27.933 に答える
-3
def NewFileName(fichier):
    cpt = 0
    fic , *ext =  fichier.split('.')
    ext = '.'.join(ext)
    while os.path.isfile(fichier):
        cpt += 1
        fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
    return fichier
于 2015-11-06T20:24:11.197 に答える
-5
name_only=file_name[:filename.index(".")

これにより、最も一般的な最初の「.」までのファイル名が得られます。

于 2014-08-22T19:19:24.640 に答える