我应该使用哪一个:os.sep 还是 os.path.sep?
Posted
技术标签:
【中文标题】我应该使用哪一个:os.sep 还是 os.path.sep?【英文标题】:which one should I use: os.sep or os.path.sep? 【发布时间】:2011-10-17 13:11:00 【问题描述】:它们是相同的,但我应该使用哪一个?
http://docs.python.org/library/os.html:
os.sep
操作系统用来分隔路径名组件的字符。这是 '/' 用于 POSIX 和 '\' 用于 Windows。请注意,知道这一点并不足以解析或连接路径名——使用 os.path.split() 和 os.path.join()——但它有时很有用。也可以通过 os.path 获得。
【问题讨论】:
它们并不总是相同的。例如,在 Mac OS X 上,os.sep
返回/
,但os.pathsep
返回:
。
@jvriesem os.pathsep
应该不同于 os.path.sep
和 os.sep
。请参阅os.pathsep 与 os.sep
只是为了让像我一样可能误读 jvriesem 和 JETM 的 cmets 的读者明白这一点。 os.sep
和 os.path.sep
在任何操作系统上的值都是一致的,os.pathsep
(路径和 sep 之间没有点)是 completely different。
【参考方案1】:
以下示例可以突出 os.path.join 和 os.path.sep.join 之间的区别。
>>> import os
>>> os.path.join("output", "images", "saved")
'output/images/saved'
>>> os.path.sep.join(["output", "images", "saved"])
'output/images/saved'
我猜 os.path.sep.join 更健壮,可以在不修改任何操作系统的情况下使用。
【讨论】:
这似乎是os.path.sep
类的实际用途。【参考方案2】:
如果您使用的是 Python 2.7,我建议使用 os.sep
(有效)而不是 os.path.sep
(已损坏),因为 Windows 上的 Jython 存在返回 "/"
斜杠而不是所需的 "\"
反斜杠的错误。
【讨论】:
【参考方案3】:我会使用os.path.sep
来明确表示它是路径分隔符……但一致性更重要,所以如果已经在使用它,请使用它。否则,请选择一个并一直使用它。
编辑:不过,为了确保您没有重新发明***,path
模块已经具有 join
、split
、dirname
和 basename
函数…所以你应该很少需要使用path.sep
:
>>> os.path.join("foo", "bar", "baz")
'foo/bar/baz'
>>> os.path.split(_)
('foo/bar', 'baz')
【讨论】:
文档似乎只记录了os.sep,而且使用os.sep的地方似乎比os.path.sep多。我同意你的观点, os.path.sep 更清楚。有没有从原设计者的角度考虑我们不知道的地方? 这很奇怪,因为sep
实际上是在path
模块中定义的(嗯,特别是$SYSTEMpath
模块,其中$SYSTEM
是,例如posix
,nt
等),并显式导入os
(来自os.py
,在加载了正确的操作系统专用“os”和“path”模块后:from os.path import (…, sep, …)
。
所以,tl;博士:我不确定。如果将path
模块的所有 都导入os
会有意义……但有些部分(例如path.join
)不是。
zhigang:您在问题中引用的文档说“也可以通过 os.path 获得。”
是的。我知道了。这是否意味着首选“os.sep”?【参考方案4】:
为了清楚起见,我建议您使用os.path.sep
,因为它是路径分隔符,而不是操作系统分隔符。如果你import os.path as path
可以叫path.sep
,那就更好了。
【讨论】:
我觉得奇怪的是os.path.sep
没有在documentation for os.path 中提及,也没有在3.6-dev docs 中提及。但是os.sep
是。但是,提到了os.path.supports_unicode_filenames
(常量/只读/属性)。也许要提交一个错误。
我猜他们故意不记录它以鼓励使用os.sep
。不过可能是错的。以上是关于我应该使用哪一个:os.sep 还是 os.path.sep?的主要内容,如果未能解决你的问题,请参考以下文章
React 还是 Vue: 你应该选择哪一个Web前端框架?