在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)
我很惊讶没有人提到过pathlib
, pathlib
真棒!
如果你需要所有的后缀(例如,如果你有一个.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.gz
, file.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]