当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Python中从文件名中提取扩展名》经验,为你挑选了15个好方法。

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



1> nosklo..:

是.使用os.path.splitext(参见Python 2.X文档或Python 3.X文档):

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


标准的Python函数命名约定真的很烦人 - 几乎每次我重新查看它时,我都认为它是`splittext`.如果他们只是做任何事来表示这个名字的各个部分之间的中断,那么就会更容易认识到它是`splitExt`或`split_ext`.当然,我不能成为犯这个错误的唯一人吗?
@ klingt.net嗯,在这种情况下,`.asd`真的是扩展!! 如果你考虑一下,`foo.tar.gz`是一个**gzip压缩文件**(`.gz`)恰好是一个**tar文件**(`.tar`).但它首先是**gzip文件**.我不希望它完全返回双扩展.
不会'endwith()`不是更便携和pythonic?
因为`os.path.basename("/ path/to/somefile.ext")`将返回`"somefile.ext",所以使用`basename`有点令人困惑.
@Vingtoft您在评论中没有提到werkzeug的FileStorage,这个问题与该特定场景无关.如何传递文件名可能有问题.`os.path.splitext('somefile.ext')`=>`('somefile','.ext')`.在没有引用某些第三方库的情况下,随意提供一个实际的反例.
如果您的文件具有"双扩展名",例如`.mp3.asd`,则不能依赖它,因为它只返回"最后"扩展名!
@Vingtoft结果相同的文件名或文件路径.请在只有文件名的情况下试一试,看看你在对这个备受推崇的答案提出反诉之前得到了什么.
另请参见下面有关`lower()`和double扩展的思想
@ ArtOfWarfare,IMO区分大小写的标识符将被记住,是有史以来最疯狂的设计决策之一。至少他们可以使用CamelCase命名函数,以使其更易于阅读。
@ArtOfWarfare鉴于`os.path`子模块的体积很小,您可以想象可以在保存在Python路径中的自己模块中手动重新映射名称。例如,“ myospath.py”包含诸如“ splitExt = os.path.splitext”之类的内容。

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


这实际上取决于你是否使用`from os import path`然后在你的本地范围内占用名称`path`,其他查看代码的人也可能不会立即知道路径是os模块的路径.就像你使用`import os.path`一样,它将它保存在`os`命名空间内,无论你在何处进行调用,人们都会立即知道``os`模块中的`path()`.
我知道它在语义上没有任何不同,但我个人觉得构造`_,extension = os.path.splitext(filename)`看起来更漂亮.
出于好奇,为什么`导入os.path`而不是`从os导入路径`?
如果你想将扩展作为更复杂表达式的一部分,[1]可能更有用:`if check_for_gzip和os.path.splitext(filename)[1] =='.gz':`

3> JeromeJ..:

版本3.4中的新功能.

import pathlib

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

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

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


获取.tar.gz:`''.join(pathlib.Path('somedir/file.tar.gz').suffixes)的例子

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

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



5> Murat Çorlu..:

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

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

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

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

但你必须小心:

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


并不是.名为"x.tar.gz"的文件的扩展名为"gz"而不是"tar.gz".os.path.splitext也将".os"作为扩展名.
[-1]获取按点分割的项目的最后一项.示例:`"my.file.name.js".split('.')=> ['my','file','name','js]`
如果您要上传x.tar.gz,这会让您感到不安

6> blented..:

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

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



7> 小智..:

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

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



8> 小智..:

随着splitext有与双扩展名的文件的问题(例如file.tar.gz,file.tar.bz2等..)

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

但应该是: .tar.gz

可能的解决方案在这里


不,它应该是.gz

9> 小智..:

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

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

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

例:

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

会给你:'csv'



10> PascalVKoote..:

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

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



11> 小智..:
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]



12> r3t40..:

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

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

# Output 
'.txt'



13> Alex..:

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



14> 小智..:

您可以在split上使用filename

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

这不需要额外的库



15> 小智..:

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

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


[@weiyixie](/sf/ask/17360801/)已建议使用rpartition。
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有