从文件名中提取扩展名

2024-12-24 08:55:00
admin
原创
64
摘要:问题描述:是否有从文件名中提取扩展名的函数?解决方案 1:使用os.path.splitext:>>> import os >>> filename, file_extension = os.path.splitext('/path/to/somefile.ext') &g...

问题描述:

是否有从文件名中提取扩展名的函数?


解决方案 1:

使用os.path.splitext

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

解决方案 2:

3.4 版本中的新功能。

import pathlib

print(pathlib.Path('yourPath.example').suffix)  # '.example'
print(pathlib.Path("hello/foo.bar.tar.gz").suffixes)  # ['.bar', '.tar', '.gz']
print(pathlib.Path('/foo/bar.txt').stem)  # 'bar'

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

解决方案 3:

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

解决方案 4:

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

仅获取扩展的文本,不包含点。

解决方案 5:

对于简单的用例,一个选项可能是从点分离:

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

当文件没有扩展名时不会出现错误:

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

但你必须小心:

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

也不能处理 Unix 系统中的隐藏文件:

>>> ".bashrc".split(".")[-1]
'bashrc'    # But this is not an extension

对于一般用途,最好os.path.splitext

解决方案 6:

值得在其中添加一个较低的值,这样您就不会发现自己想知道为什么 JPG 没有出现在您的列表中。

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

解决方案 7:

使用 splitext 时,具有双重扩展名的文件会出现问题(例如file.tar.gzfile.tar.bz2等等)。

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

但应该是:.tar.gz

可能的解决方案在这里

解决方案 8:

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

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

解决方案 9:

您可以在 pathlib 模块(在 python 3.x 中可用)中找到一些很棒的东西。

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

# Output 
'.txt'

解决方案 10:

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'

解决方案 11:

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

要获取给定文件绝对路径的扩展名,您只需输入:

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

例子:

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

将返回:'csv'

解决方案 12:

令人惊讶的是,这一点尚未被提及:

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:

split您可以在 a 上使用filename

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

这不需要额外的库

解决方案 14:

使用 Python 从文件名中提取扩展名

Python os 模块 splitext()

splitext()函数将文件路径拆分为一个具有两个值的元组——根和扩展名。

import os
# unpacking the tuple
file_name, file_extension = os.path.splitext("/Users/Username/abc.txt")
print(file_name)
print(file_extension)

使用 Pathlib 模块获取文件扩展名

Pathlib 模块获取文件扩展名

import pathlib
pathlib.Path("/Users/pankaj/abc.txt").suffix
#output:'.txt'

解决方案 15:

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

解决方案 16:

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

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

解决方案 17:

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

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

解决方案 18:

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

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

解决方案 19:

您可以使用以下代码来拆分文件名和扩展名。

    import os.path
    filenamewithext = os.path.basename(filepath)
    filename, ext = os.path.splitext(filenamewithext)
    #print file name
    print(filename)
    #print file extension
    print(ext)

解决方案 20:

嗯,我知道我迟到了

这是我的简单解决方案

file = '/foo/bar/whatever.ext'
extension = file.split('.')[-1]
print(extension)

#output will be ext

解决方案 21:

如果你喜欢正则表达式,那么这是真正的单行代码。即使中间有额外的“。”也没关系

import re

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

查看结果:点击此处

解决方案 22:

您可以使用endswith来识别 python 中的文件扩展名

就像下面的例子

for file in os.listdir():
    if file.endswith('.csv'):
        df1 =pd.read_csv(file)
        frames.append(df1)
        result = pd.concat(frames)

解决方案 23:

试试这个:

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. 然后检查一下

解决方案 24:

最简单的获取方式是使用mimtypes,下面是示例:

import mimetypes

mt = mimetypes.guess_type("file name")
file_extension =  mt[0]
print(file_extension)

解决方案 25:

我确实迟到了,但如果有人想在不使用其他库的情况下实现这一点:

file_path = "example_tar.tar.gz"
file_name, file_ext = [file_path if "." not in file_path else file_path.split(".")[0], "" if "." not in file_path else file_path[file_path.find(".") + 1:]]
print(file_name, file_ext)

第二行基本上只是以下代码,但挤在一行中:

def name_and_ext(file_path):
    if "." not in file_path:
        file_name = file_path
    else:
        file_name = file_path.split(".")[0]
    if "." not in file_path:
        file_ext = ""
    else:
        file_ext = file_path[file_path.find(".") + 1:]
    return [file_name, file_ext]

尽管这有效,但它可能无法对所有类型的文件起作用,具体来说.zshrc,我建议使用osos.path.splitext功能,如下例所示:

import os
file_path = "example.tar.gz"
file_name, file_ext = os.path.splitext(file_path)
print(file_name, file_ext)

干杯 :)

解决方案 26:

为了好玩...只需将扩展收集到一个字典中,并将它们全部跟踪到一个文件夹中。然后只需拉出您想要的扩展即可。

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)

解决方案 27:

此方法将需要一个字典、列表或集合。您可以使用内置字符串方法使用“.endswith”。这将在文件末尾的列表中搜索名称,只需使用即可完成str.endswith(fileName[index])。这更多用于获取和比较扩展。

https://docs.python.org/3/library/stdtypes.html#string-methods

例1

dictonary = {0:".tar.gz", 1:".txt", 2:".exe", 3:".js", 4:".java", 5:".python", 6:".ruby",7:".c", 8:".bash", 9:".ps1", 10:".html", 11:".html5", 12:".css", 13:".json", 14:".abc"} 
for x in dictonary.values():
    str = "file" + x
    str.endswith(x, str.index("."), len(str))

示例 2:

set1 = {".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"}
for x in set1:
   str = "file" + x
   str.endswith(x, str.index("."), len(str))

示例 3:

fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"];
for x in range(0, len(fileName)):
    str = "file" + fileName[x]
    str.endswith(fileName[x], str.index("."), len(str))

示例 4

fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"];
str = "file.txt"
str.endswith(fileName[1], str.index("."), len(str))

示例 5、6、7 的输出
在此处输入图片描述

示例 8

fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"];
exts = []
str = "file.txt"
for x in range(0, len(x)):
    if str.endswith(fileName[1]) == 1:
         exts += [x]
     

解决方案 28:

如果你想提取最后一个文件扩展名(如果它有多个)

class functions:
    def listdir(self, filepath):
        return os.listdir(filepath)
    
func = functions()

os.chdir("C:\\UsersAsus-pcDownloads") #absolute path, change this to your directory
current_dir = os.getcwd()

for i in range(len(func.listdir(current_dir))): #i is set to numbers of files and directories on path directory
    if os.path.isfile((func.listdir(current_dir))[i]): #check if it is a file
        fileName = func.listdir(current_dir)[i] #put the current filename into a variable
        rev_fileName = fileName[::-1] #reverse the filename
        currentFileExtension = rev_fileName[:rev_fileName.index('.')][::-1] #extract from beginning until before .
        print(currentFileExtension) #output can be mp3,pdf,ini,exe, depends on the file on your absolute directory

输出为 mp3,即使只有 1 个扩展名也可以工作

解决方案 29:

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

解决方案 30:

a = ".bashrc"
b = "text.txt"
extension_a = a.split(".")
extension_b = b.split(".")
print(extension_a[-1])  # bashrc
print(extension_b[-1])  # txt
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   990  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   26  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   27  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   26  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   53  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用