os.path.splitext优于常规.split的好处?

时间:2009-02-12 18:10:51

标签: python

this other question中,投票清楚地表明os.path.splitext函数优于简单.split('.')[-1]字符串操作。有没有人有时间解释为什么会这样?是更快,更准确,还是什么?我愿意接受它有更好的东西,但我不能立即看到它可能是什么。可能导入整个模块来执行此操作是否过度,至少在简单的情况下?

编辑:操作系统特异性是一个巨大的胜利,并不是立即显而易见的;但即便如此,我也应该看到“如果没有一个点”会怎样的情况!感谢大家对图书馆使用的一般性评论。

11 个答案:

答案 0 :(得分:38)

嗯,单独的操作系统有单独的实现。这意味着如果提取文件扩展名的逻辑在Mac上与Linux上的不同,那么这些区别将由这些区别来处理。我不知道有任何这样的区别,所以可能没有。


修改@Brian评论/directory.ext/file这样的示例当然不适用于简单的.split('.')调用,您必须知道这两个问题目录可以使用扩展,以及在某些操作系统上,正斜杠是一个有效的目录分隔符。

这只是强调使用库例程,除非你有充分的理由不我的答案。

感谢@Brian


此外,如果文件没有扩展名,则必须构建逻辑来处理该情况。如果你试图拆分的东西是一个以反斜杠结尾的目录名怎么办?没有文件名也没有扩展名。

规则应该是除非您有特殊原因不使用符合您需要的库函数,否则请使用它。这将避免您必须维护和修复代码,其他人有完美的解决方案。

答案 1 :(得分:14)

os.path.splitext将正确处理文件没有扩展名并返回空字符串的情况。 .split将返回文件名。

答案 2 :(得分:11)

splitext()反向搜索“。”并在找到后立即返回扩展部分。 split('.')会对所有''进行搜索。字符,因此几乎总是较慢。换句话说,splitext()专门用于返回与split()不同的扩展名。

(如果要检查实现,请参阅Python源代码中的posixpath.py。)

答案 3 :(得分:6)

存在不使用'。'作为扩展分隔符的操作系统。

(值得注意的是,按惯例,RISC OS使用'/',因为'。'在那里用作路径分隔符。)

答案 4 :(得分:2)

一个明确定义和记录的获取文件扩展名的方法总是比不分层的字符串更受欢迎,因为由于各种原因该方法会更脆弱。

编辑:这不是特定于语言的。

答案 5 :(得分:2)

  1. 正确工作的正确工具
  2. 已经作为Python标准库的一部分进行了彻底的调试和测试 - 手动滚动版本中的错误没有引入错误(例如,如果没有扩展名,或者文件是UNIX上的隐藏文件,如'.bashrc' ,或者有多个扩展名?)
  3. 为此目的而设计,该函数具有传递的文件名的有用返回值(basename,ext),这在某些情况下可能更有用,而不必手动拆分路径(同样,边缘情况可能是一个问题,当找出基本名称 - 分机
  4. 担心导入模块的唯一原因是开销问题 - 在绝大多数情况下这不太可能是一个问题,如果紧张,那么Python中的其他开销很可能会成为一个更大的问题。这一点。

答案 6 :(得分:1)

第一个也是最明显的区别是,当没有扩展名时,拆分调用没有逻辑默认值。

这也可以通过正则表达式来实现,以使其在没有额外包含的情况下表现为1个衬里,但如果扩展名不存在则仍然返回空字符串。

此外,路径库可以处理具有不同文件夹分隔符的路径的不同上下文。

答案 7 :(得分:0)

在对提供此解决方案的答案的评论中:

  

“如果文件没有扩展名,则会错误地返回文件名而不是空字符串。”

并非每个文件都有扩展名。

答案 8 :(得分:0)

除了是标准的,因此保证可用,os.path.splitext

处理边缘情况 - 就像缺少扩展名一样 提供保证 - 除了正确退回扩展程序(如果存在)外,还可以保证root + ext始终返回完整路径。
是跨平台的 - 在Python源代码中实际上有三个不同版本的os.path,它们是根据Python认为你所使用的操作系统调用的。
更具可读性 - 请考虑您的版本要求用户知道数组可以使用负数编制索引。

不过,它应该不会更快。

答案 9 :(得分:0)

1)简单拆分('。')[ - 1]将无法正确处理路径为C:\ foo.bar \ Makefile,因此您需要首先使用os.path.basename()提取基本名称,并且即使在这种情况下,如果没有正确扩展,它将无法拆分文件。 os.path.splitext在幕后做这件事。

2)尽管os.path.splitext是跨平台解决方案,但它并不理想。让我们看看带有前导点的特殊文件,例如.cvsignore,.bzrignore,.hgignore(它们在某些VCS中作为特殊文件非常流行)。 os.path.splitext将返回整个文件名作为扩展名,虽然它似乎不适合我。因为在这种情况下没有扩展名的名称是空字符串。虽然这是Python标准库的预期行为,但它可能不是用户想要的实际行为。

答案 10 :(得分:0)

我不确定Python是否已经移植到VMS平台上,但假设它已经(*):

  • 文件名的格式通常为:$ device-dir-subdir $ filename。$ type; $ version(**)

我希望您意识到使用仅受 所影响的系统影响的窄范围方法,对于长期代码可维护性而言并不是最佳的,并且此类实践是在大型软件项目中混合和匹配不同的软件组件尤其有害。

基本上,在后一种情况下,成功概率(可靠性)类似于

  

R(T)= 1-(1-RI)^ n的

现在您可以看到软件实施的糟糕/不完整程度如何导致错误的程序。 更广泛地说,由于存在这样的错误,移植软件很困难。

(*)嗯,谷歌搜索很快透露:https://www.vmspython.org
(**)检查这里的正则表达式战争! https://stackoverflow.com/a/4465456/1574494