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

时间:2009-02-12 14:11:51

标签: python filenames file-extension

是否有从文件名中提取扩展名的功能?

24 个答案:

答案 0 :(得分:1651)

是。使用os.path.splitext(请参阅Python 2.X documentationPython 3.X documentation):

>>> 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', '')

答案 1 :(得分:349)

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

答案 2 :(得分:136)

版本3.4中的新功能。

import pathlib

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

我很惊讶没人提到pathlibpathlib太棒了!

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

答案 3 :(得分:94)

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

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

答案 4 :(得分:63)

一个选项可能是从点分割:

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

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

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

但你必须小心:

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

答案 5 :(得分:33)

值得在那里添加一个较低的,所以你不会发现自己想知道为什么JPG没有出现在你的列表中。

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

答案 6 :(得分:14)

上面的任何解决方案都有效,但是在linux上我发现扩展字符串末尾有一个换行符会阻止匹配成功。将strip()方法添加到最后。例如:

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

答案 7 :(得分:13)

使用splitext时,双扩展文件存在问题(例如file.tar.gzfile.tar.bz2等。)

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

但应该是:.tar.gz

可能的解决方案是here

答案 8 :(得分:10)

虽然这是一个古老的话题,但我想知道为什么在这种情况下没有提到一个叫做rpartition的非常简单的pyi api:

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

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

示例:

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

会给你:' csv'

答案 9 :(得分:8)

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

答案 10 :(得分:7)

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

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

# Output 
'.txt'

答案 11 :(得分:6)

您可以在split上使用filename

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

这不需要额外的库

答案 12 :(得分:6)

join全部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'

答案 13 :(得分:4)

这是一种直接的字符串表示技术: 我看到很多提到的解决方案,但我认为大多数都在考虑拆分。 然而拆分在每次出现“。”时都会发生。 。 你宁愿寻找的是分区。

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

答案 14 :(得分:3)

右分裂的另一种解决方案:

# 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])

答案 15 :(得分:3)

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

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

答案 16 :(得分:2)

如果您喜欢正则表达式,则是真正的单线。 而且即使您有其他“。”也没关系。在中间

import re

file_ext = re.search(r"\.([^.]+)$", filename).group(1)

查看结果,这里:Click Here

答案 17 :(得分:1)

尝试一下:

files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']

for file in files: #1
    if (file.split(".")[-2] in pen_ext): #2
        ext =  file.split(".")[-2]+"."+file.split(".")[-1]#3
    else:
        ext = file.split(".")[-1] #4
    print (ext) #5
  1. 获取列表中的所有文件名
  2. 拆分文件名并检查倒数第二个扩展名,是否在pen_ext列表中?
  3. 如果是,则将其与最后一个扩展名合并,并将其设置为文件的扩展名
  4. 如果没有,那么只需将最后一个扩展名作为文件的扩展名
  5. 然后签出

答案 18 :(得分:0)

这是最简单的方法,仅需单行即可获取文件名和扩展名。

fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')

>>> print(fName)
Flower
>>> print(ext)
jpeg

与其他解决方案不同,您不需要为此导入任何软件包。

答案 19 :(得分: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)

答案 20 :(得分:-1)

a = ".bashrc"
b = "text.txt"
extension_a = a.split(".")
extension_b = b.split(".")
print(extension_a[-1])  # bashrc
print(extension_b[-1])  # txt

答案 21 :(得分:-2)

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

答案 22 :(得分:-3)

# 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 ""

答案 23 :(得分:-7)

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

这将为您提供第一个“。”的文件名,这将是最常见的。