Extracting extension from filename in Python
是否有从文件名中提取扩展名的函数?
对。使用
1 2 3 4 5 6 | >>> import os >>> filename, file_extension = os.path.splitext('/path/to/somefile.ext') >>> filename '/path/to/somefile' >>> file_extension '.ext' |
与大多数手动字符串拆分尝试不同,
1 2 3 4 | >>> os.path.splitext('/a/b.c/d') ('/a/b.c/d', '') >>> os.path.splitext('.bashrc') ('.bashrc', '') |
1 2 | import os.path extension = os.path.splitext(filename)[1] |
3.4版新增。
1 2 3 | import pathlib print(pathlib.Path('yourPathGoesHere').suffix) |
我很惊讶没有人提到过
如果您需要所有后缀(例如,如果您有一个
1 2 | import os.path extension = os.path.splitext(filename)[1][1:] |
只获取扩展名的文本,不带点。
一个选项可以从点拆分:
1 2 3 | >>> filename ="example.jpeg" >>> filename.split(".")[-1] 'jpeg' |
文件没有扩展名时没有错误:
1 2 | >>>"filename".split(".")[-1] 'filename' |
但你必须小心:
1 2 | >>>"png".split(".")[-1] 'png' # But file doesn't have an extension |
值得在里面加一个较低的,这样你就不会发现自己在想为什么JPG没有出现在你的列表中。
1 | os.path.splitext(filename)[1][1:].strip().lower() |
上面的任何解决方案都可以工作,但是在Linux上,我发现扩展字符串的末尾有一个新行,这将阻止匹配成功。在末尾添加
1 2 | import os.path extension = os.path.splitext(filename)[1][1:].strip() |
对于splitext,具有双重扩展名的文件(例如
1 2 3 | >>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz') >>> fileExtension '.gz' |
但应该是:
可能的解决方案在这里
虽然这是一个古老的主题,但我想知道为什么没有提到一个非常简单的python API,在本例中称为rpartition:
要获取给定文件绝对路径的扩展名,只需键入:
1 | filepath.rpartition('.')[-1] |
例子:
1 2 | path = '/home/jersey/remote/data/test.csv' print path.rpartition('.')[-1] |
会给你:"csv"
1 2 | filename='ext.tar.gz' extension = filename[filename.rfind('.'):] |
令人惊讶的是,还没有提到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
效益:
- 为我能想到的任何事情按预期工作
- 无模块
- 无正则表达式
- 跨平台
- 易于扩展(例如,没有用于扩展的前导点,只有扩展的最后一部分)
作为函数:
1 2 3 4 | def get_extension(filename): basename = os.path.basename(filename) # os independent ext = '.'.join(basename.split('.')[1:]) return '.' + ext if ext else None |
您可以在Pathlib模块中找到一些很棒的东西。
1 2 3 4 5 6 | import pathlib x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix print(x) # Output '.txt' |
您可以在
1 2 | f_extns = filename.split(".") print ("The extension of the file is :" + repr(f_extns[-1])) |
这不需要额外的库
只有
1 2 3 4 5 6 | >>> x = 'file/path/archive.tar.gz' >>> y = 'file/path/text.txt' >>> ''.join(pathlib.Path(x).suffixes) '.tar.gz' >>> ''.join(pathlib.Path(y).suffixes) '.txt' |
另一个正确拆分的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 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]) |
这是一种直接的字符串表示技术:我看到了很多提到的解决方案,但我认为大多数都在考虑拆分。但是,每次出现"."时都会拆分。您更愿意寻找的是分区。
1 2 | string ="folder/to_path/filename.ext" extension = string.rpartition(".")[-1] |
即使这个问题已经被回答了,我也会在regex中添加解决方案。
1 2 3 4 5 | >>> import re >>> file_suffix =".*(\..*)" >>> result = re.search(file_suffix,"somefile.ext") >>> result.group(1) '.ext' |
1 2 3 4 5 6 7 8 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 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"" |
1 | name_only=file_name[:filename.index(".") |
这将使您的文件名达到第一个".",这将是最常见的。