Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Python中,从文件名中提取文件扩展名的方法是什么?_Python_String - Fatal编程技术网

什么';在Python中,从文件名中提取文件扩展名的方法是什么?

什么';在Python中,从文件名中提取文件扩展名的方法是什么?,python,string,Python,String,文件名是动态的,我需要提取文件扩展名。文件名如下所示: parallels-workstation-parallels-en_US-6.0.13976.769982.run.sh 20090209.02s1.1_sequence.txt SRR002321.fastq.bz2 hello.tar.gz ok.txt 对于第一个我想提取txt,对于第二个我想提取fastq.bz2,对于第三个我想提取tar.gz 我正在使用os模块获取文件扩展名,如下所示: import os.path exte

文件名是动态的,我需要提取文件扩展名。文件名如下所示: parallels-workstation-parallels-en_US-6.0.13976.769982.run.sh

20090209.02s1.1_sequence.txt
SRR002321.fastq.bz2
hello.tar.gz
ok.txt
对于第一个我想提取
txt
,对于第二个我想提取
fastq.bz2
,对于第三个我想提取
tar.gz

我正在使用os模块获取文件扩展名,如下所示:

import os.path
extension = os.path.splitext('hello.tar.gz')[1][1:]

这只给了我gz,如果文件名是
ok.txt
,这很好,但是对于这一个,我希望扩展名是
tar.gz
,你的规则是任意的,计算机如何猜测扩展名中有
什么时候可以

充其量只能有一组异常扩展,例如
{.bz2'、'.gz'}
并自己添加一些额外的逻辑

>>> paths = """20090209.02s1.1_sequence.txt
... SRR002321.fastq.bz2
... hello.tar.gz
... ok.txt""".splitlines()
>>> import os
>>> def my_split_ext(path):
...     name, ext = os.path.splitext(path)
...     if ext in {'.bz2', '.gz'}:
...         name, ext2 = os.path.splitext(name)
...         ext = ext2 + ext
...     return name, ext
... 
>>> map(my_split_ext, paths)
[('20090209.02s1.1_sequence', '.txt'), ('SRR002321', '.fastq.bz2'), ('hello', '.tar.gz'), ('ok', '.txt')]
删除点:

import os

def splitext(path):
    for ext in ['.tar.gz', '.tar.bz2']:
        if path.endswith(ext):
            path, ext = path[:-len(ext)], path[-len(ext):]
            break
    else:
        path, ext = os.path.splitext(path)
    return path, ext[1:]

assert splitext('20090209.02s1.1_sequence.txt')[1] == 'txt'
assert splitext('SRR002321.fastq.bz2')[1] == 'bz2'
assert splitext('hello.tar.gz')[1] == 'tar.gz'
assert splitext('ok.txt')[1] == 'txt'

显然,上面假设有一个
,但它看起来不像os.path会做你想做的事。

好吧,你可以在root上不断迭代,直到
ext
为空。换言之:

filename = "hello.tar.gz"
extensions = []
root, ext = os.path.splitext(filename)
while ext:
    extensions.append(ext)
    root, ext = os.path.splitext(root)

# do something if extensions length is greater than 1

我知道这是一个非常古老的话题,但是对于其他遇到这个话题的人,我想分享我的解决方案(我同意这取决于你的程序逻辑)

我只需要不带扩展名的基名称,您可以随意拆分ext,这使得spitext返回(base,ext),其中base始终是basename,ext仅在找到扩展名时包含扩展名。 因此,对于具有单周期或双周期(.tar.gz和.txt)的文件,以下内容始终返回基本名称:

base = os.path.splitext(os.path.splitext(filename)[0])[0]

如果您希望文件名包含点,则splittext通常不是一个好选项,相反,我更喜欢:

>> import re
>> re.compile("(?P<name>.+?)(\.(?P<extension>.{1,4}))?$").search("blabla.blublu.tmp").groupdict()
{'extension': 'tmp', 'name': 'blabla.blublu'}
>> re.compile("(?P<name>.+?)(\.(?P<extension>.{1,4}))?$").search("blabla.blublu.tmpmoreblabla").groupdict()
{'extension': None, 'name': 'blabla.blublu.tmpmoreblabla'}
>> re.compile("(?P<name>.+?)(\.(?P<extension>.{1,4}))?$").search("blabla.blublu.tmpmoreblabla.ext").groupdict()
{'extension': 'ext', 'name': 'blabla.blublu.tmpmoreblabla'}
>重新导入
>>重新编译((?P.+?)(\(?P.{1,4}))?$)。搜索(“blabla.blublu.tmp”).groupdict()
{'extension':'tmp','name':'blablabla.blublu'}
>>重新编译((?P.+?)(\(?P.{1,4}))?$)。搜索(“blabla.blublu.tmpmoreblala”).groupdict()
{'extension':无,'name':'blablabla.blublu.tmpmoreballa'}
>>重新编译((?P.+?)(\(?P.{1,4}))?$).search(“blabla.blublu.tmpmorebla.ext”).groupdict()
{'extension':'ext','name':'blablabla.blublu.tmpmoreballa'}
只需检查第二个大小写“blabla.blublu.tmpmorebla”,如果这是一个没有扩展名的文件名,splittext仍然将
tmpmorebla
作为扩展名返回,您对这段代码的唯一假设是:

  • 您总是将非空字符串作为输入
  • 您的文件名和扩展名可以包含任何可能的字符
  • 文件扩展名长度在1到4个字符之间(如果有 更多字符,它将不被视为扩展名,而是名称的一部分)
  • 字符串以扩展名文件结尾
  • 当然,您可以使用未命名的组来删除
    ?p
    ,但我更喜欢在这种情况下使用命名组

    您必须使用“if-else”或“case”语句来处理特殊情况这对您有帮助。。
    base = os.path.splitext(os.path.splitext(filename)[0])[0]
    
    >> import re
    >> re.compile("(?P<name>.+?)(\.(?P<extension>.{1,4}))?$").search("blabla.blublu.tmp").groupdict()
    {'extension': 'tmp', 'name': 'blabla.blublu'}
    >> re.compile("(?P<name>.+?)(\.(?P<extension>.{1,4}))?$").search("blabla.blublu.tmpmoreblabla").groupdict()
    {'extension': None, 'name': 'blabla.blublu.tmpmoreblabla'}
    >> re.compile("(?P<name>.+?)(\.(?P<extension>.{1,4}))?$").search("blabla.blublu.tmpmoreblabla.ext").groupdict()
    {'extension': 'ext', 'name': 'blabla.blublu.tmpmoreblabla'}