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

有没有从文件名中提取扩展名的function?

是。 使用os.path.splitext

 >>> import os >>> filename, file_extension = os.path.splitext('/path/to/somefile.ext') >>> filename '/path/to/somefile' >>> file_extension '.ext' 
 import os.path extension = os.path.splitext(filename)[1] 
 import os.path extension = os.path.splitext(filename)[1][1:] 

只得到扩展的文本,没有点。

3.4版本中的新function

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

我很惊讶没有人提到过pathlibpathlib真棒!

如果你需要所有的后缀(例如,如果你有一个.tar.gz.suffixes将返回一个列表!

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

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

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

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

但是你一定要小心:

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

值得在这里添加一个较低的值,所以你不觉得自己想知道为什么JPG没有显示在你的列表中。

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

上述任何解决scheme的工作,但在Linux上,我发现在扩展string的末尾有一个换行符,这将防止匹配成功。 将strip()方法添加到最后。 例如:

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

用splitext文件有双扩展名的问题(例如file.tar.gzfile.tar.bz2等)。

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

但应该是: .tar.gz

可能的解决scheme在这里

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

惊讶这还没有提到:

 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 

优点:

  • 像我所想的那样按预期工作
  • 没有模块
  • 没有正则expression式
  • 跨平台
  • 易于扩展(例如,没有扩展的前导点,只有扩展的最后部分)

作为功​​能:

 def get_extension(filename): basename = os.path.basename(filename) # os independent ext = '.'.join(basename.split('.')[1:]) return '.' + ext if ext else None 

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

要获得给定文件的绝对path的扩展名,可以简单地input:

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

例:

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

会给你:'csv'

另一种解决scheme:

 # 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]) 
 def NewFileName(fichier): cpt = 0 fic , *ext = fichier.split('.') ext = '.'.join(ext) while os.path.isfile(fichier): cpt += 1 fichier = '{0}-({1}).{2}'.format(fic, cpt, ext) return fichier 
 # try this, it works for anything, any length of extension # eg 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 "" 

即使这个问题已经答案,我会在正则expression式添加解决scheme。

 >>> import re >>> file_suffix = ".*(\..*)" >>> result = re.search(file_suffix, "somefile.ext") >>> result.group(1) '.ext' 
 name_only=file_name[:filename.index(".") 

这会给你的文件名称第一个“。”,这将是最常见的。

如果你知道确切的文件扩展名例如file.txt,那么你可以使用

打印文件名[0:-4]