在python中从文件名提取扩展名

Extracting extension from filename in Python

是否有从文件名中提取扩展名的函数?


对。使用os.path.splitext(请参阅python 2.x文档或python 3.x文档):

1
2
3
4
5
6
>>> 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

1
2
3
4
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')


1
2
import os.path
extension = os.path.splitext(filename)[1]


3.4版新增。

1
2
3
import pathlib

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

我很惊讶没有人提到过pathlib,但是,pathlib太棒了!

如果您需要所有后缀(例如,如果您有一个.tar.gz),.suffixes将返回它们的列表!


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

只获取扩展名的文本,不带点。


一个选项可以从点拆分:

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

文件没有扩展名时没有错误:

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

但你必须小心:

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


值得在里面加一个较低的,这样你就不会发现自己在想为什么JPG没有出现在你的列表中。

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

上面的任何解决方案都可以工作,但是在Linux上,我发现扩展字符串的末尾有一个新行,这将阻止匹配成功。在末尾添加strip()方法。例如:

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


对于splitext,具有双重扩展名的文件(例如file.tar.gzfile.tar.bz2等)存在问题。

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

但应该是:.tar.gz

可能的解决方案在这里


虽然这是一个古老的主题,但我想知道为什么没有提到一个非常简单的python API,在本例中称为rpartition:

要获取给定文件绝对路径的扩展名,只需键入:

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

例子:

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

会给你:"csv"


1
2
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]


令人惊讶的是,还没有提到这一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

效益:

  • 为我能想到的任何事情按预期工作
  • 无模块
  • 无正则表达式
  • 跨平台
  • 易于扩展(例如,没有用于扩展的前导点,只有扩展的最后一部分)

作为函数:

1
2
3
4
def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None


您可以在Pathlib模块中找到一些很棒的东西。

1
2
3
4
5
6
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output
'.txt'


您可以在filename上使用split

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

这不需要额外的库


只有join所有pathlib suffixes

1
2
3
4
5
6
>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'


另一个正确拆分的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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])

这是一种直接的字符串表示技术:我看到了很多提到的解决方案,但我认为大多数都在考虑拆分。但是,每次出现"."时都会拆分。您更愿意寻找的是分区。

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


即使这个问题已经被回答了,我也会在regex中添加解决方案。

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


1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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""


1
name_only=file_name[:filename.index(".")

这将使您的文件名达到第一个".",这将是最常见的。