问题描述
我经常需要在Python
提取文件的扩展名。
我们经常在网络上看到的用于此类任务的代码是使用os.path.splitext
:
fpath = "C:/I/am/hap.py"
ext = os.path.splitext(fpath)[-1]
有什么理由比使用re.sub
(这很容易记住)更好吗?
fpath = "C:/I/am/hap.py"
ext = re.sub(r'.*\.', '.', fpath)
注意:每个解决方案中的字符数相同:)
1楼
其实2件事
更容易理解它是一种文件操作及其目的(如@larsks 所述
os.path.splitext
将支持没有扩展名的情况:
例如,使用Makefile
:
>>> fpath = "C:/Dir/Makefile"
>>> os.path.splitext(fpath)[-1]
''
>>> re.sub(r'.*\.', '.', fpath)
'C:/Dir/Makefile'
2楼
这是一个相当固执的问题(答案也是如此),但 IMO:
1.) 代码可读性。
splitext
文本已记录并易于查找以确切了解代码在做什么,因为re.sub
将某些内容替换为"."
,但现在您需要先解析该正则表达式,然后才能了解发生了什么。
2.) 没有无关的import
s。
对于在其他任何地方都没有使用正则表达式的代码,您不需要import re
,而如果您的代码用于修补系统文件,您很可能已经在使用import os
或from os import path
了。
3.) 吻。
您可以通过许多不同的方式获得相同的结果(例如ext = fpath[fpath.rfind('.'):]
或ext = f'.{fpath.split(".")[-1]}'
其中两个字符都更短),但总的来说,如果已经有一个内置函数来帮助实现它,除非你有充分的理由,否则不要重新发明轮子。
3楼
os
模块旨在处理各种场景。
特别是在您的情况下,某些操作系统使用\\
vs /
以及该操作系统独有的其他命名法。
如果您使用正则表达式完成此操作,则必须考虑所有可能性和边缘情况。