首页 文章

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

提问于
浏览
941

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

20 回答

  • 12

    是 . 使用 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', '')
    
  • 5

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

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

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

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

    但你必须小心:

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

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

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

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

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

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

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

    但应该是: .tar.gz

    可能的解决方案是here

  • 3

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

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

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

    例:

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

    会给你:'csv'

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

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

    import pathlib
    x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
    print(x)
    
    # Output 
    '.txt'
    
  • 1495

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

    >>> import re
    >>> file_suffix = ".*(\..*)"
    >>> result = re.search(file_suffix, "somefile.ext")
    >>> result.group(1)
    '.ext'
    
  • 8
    import os.path
    extension = os.path.splitext(filename)[1][1:]
    

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

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

    版本3.4中的新功能 .

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

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

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

  • -3

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

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

    只是 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'
    
  • 327

    感到惊讶的是还没有提到:

    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
    
  • 13
    name_only=file_name[:filename.index(".")
    

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

  • 6

    您可以在 filename 上使用 split

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

    这不需要额外的库

  • 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 ""
    
  • 4
    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
    
  • 29

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

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

相关问题