如何正确获取文件扩展名?

时间:2016-06-18 11:24:41

标签: python

我知道这个问题在本网站上被多次询问。但是我发现他们错过了一个重要的观点:只有一个句点的文件扩展名被考虑为*.png *.mp3,但我如何用.tar.gz这样的两个句点来处理这些文件名。

基本代码是:

filename = '/home/lancaster/Downloads/a.ppt'
extention = filename.split('/')[-1]

但显然,此代码不适用于a.tar.gz这样的文件。 怎么处理呢?感谢。

8 个答案:

答案 0 :(得分:25)

Python 3.4

您现在可以使用pathlib中的Path。它有许多功能,其中之一是suffix

>>> from pathlib import Path
>>> Path('my/library/setup.py').suffix
'.py'
>>> Path('my/library.tar.gz').suffix
'.gz'
>>> Path('my/library').suffix
''

如果您想获得多个后缀,请使用suffixes

>>> from pathlib import Path
>>> Path('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> Path('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> Path('my/library').suffixes
[]

答案 1 :(得分:20)

以下是os中的构建模块。有关os.path.splitext的更多信息。

In [1]: from os.path import splitext
In [2]: file_name,extension = splitext('/home/lancaster/Downloads/a.ppt')
In [3]: extension
Out[1]: '.ppt'

如果你必须改进.tar.gz.tar.bz2的扩展名,你必须写一个这样的函数

from os.path import splitext
def splitext_(path):
    for ext in ['.tar.gz', '.tar.bz2']:
        if path.endswith(ext):
            return path[:-len(ext)], path[-len(ext):]
    return splitext(path)

<强>结果

In [4]: file_name,ext = splitext_('/home/lancaster/Downloads/a.tar.gz')
In [5]: ext
Out[2]: '.tar.gz'

修改

通常你可以使用这个功能

from os.path import splitext
def splitext_(path):
    if len(path.split('.')) > 2:
        return path.split('.')[0],'.'.join(path.split('.')[-2:])
    return splitext(path)

它适用于所有扩展程序。

处理所有文件

In [6]: inputs = ['a.tar.gz', 'b.tar.lzma', 'a.tar.lz', 'a.tar.lzo', 'a.tar.xz','a.png']
In [7]: for file_ in inputs:                                                                    
    file_name,extension = splitext_(file_)
    print extension
   ....:     
tar.gz
tar.lzma
tar.lz
tar.lzo
tar.xz
.png

答案 2 :(得分:5)

文件扩展名的作用是告诉查看者(有时是计算机)使用哪个应用程序来处理文件。

在评论中考虑最坏的情况(a.ppt.tar.gz),这是一个已经tar-balled然后gzip压缩的PowerPoint文件。所以你需要使用gzip处理程序来打开它。使用PowerPoint或tarball处理程序是行不通的。好的,知道如何处理.tar.gz文件的聪明程序可以理解操作并使用.tar.gz文件 - 但请注意,即使是也可以扩展名只是.gz

targzip都将其扩展名添加到原始文件名,而不是替换它们(如zip那样)是一种便利。但是gzip文件的基本名称仍为a.ppt.tar

答案 3 :(得分:2)

一种可能的方法是:

  1. 切片“。” =&GT; tmp_ext = filename.split('.')[1:]
  2. 结果是一个列表= ['tar', 'gz']

    1. 将他们加在一起=&gt; extention = ".".join(tmp_ext)
    2. 结果是您的扩展名为string = 'tar.gz'

      更新:示例:

      >>> test = "/test/test/test.tar.gz"
      >>> t2 = test.split(".")[1:]
      >>> t2
      ['tar', 'gz']
      >>> ".".join(t2)
      'tar.gz'
      

答案 4 :(得分:0)

最简单的一个:

import os.path
print os.path.splitext("/home/lancaster/Downloads/a.ppt")[1]
# '.ppt'

答案 5 :(得分:0)

>>> import os
>>> import re

>>> filename = os.path.basename('/home/lancaster/Downloads/a.ppt')  
>>> extensions = re.findall(r'\.([^.]+)', basename)
['ppt']


>>> filename = os.path.basename('/home/lancaster/Downloads/a.ppt.tar.gz')  
>>> extensions = re.findall(r'\.([^.]+)', basename)
['ppt','tar','gz']

答案 6 :(得分:-1)

{{1}}

答案 7 :(得分:-1)

with re.findall and python 3.6

filename = '/home/Downloads/abc.ppt.tar.gz'

ext = r'\.\w{1,6}'

re.findall(f'{ext}\\b | {ext}$', filename,  re.X)

['.ppt', '.tar', '.gz']