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

2024-05-16 11:10:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

基本代码是:

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

但是很明显,这段代码不能处理像a.tar.gz这样的文件。 怎么处理?谢谢。


Tags: 文件代码homepng网站文件名downloadstar
3条回答

Python3.4

现在可以使用pathlib中的^{}。它有许多特性,其中之一是^{}

>>> 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
[]

这里是os中的内置模块。关于^{}的更多信息。

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

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

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

事实上,targzip都将它们的扩展名添加到原始文件名中,而不是替换它们(正如zip所做的那样),这是一种方便。但是gzip文件的基名仍然是a.ppt.tar

相关问题 更多 >