【发布时间】:2012-04-23 02:45:10
【问题描述】:
os.path 模块似乎是所有路径相关功能的默认模块。然而,listdir() 函数是os 模块的一部分,而不是os.path 模块的一部分,即使它接受路径作为其输入。为什么做出这个设计决定?
【问题讨论】:
os.path 模块似乎是所有路径相关功能的默认模块。然而,listdir() 函数是os 模块的一部分,而不是os.path 模块的一部分,即使它接受路径作为其输入。为什么做出这个设计决定?
【问题讨论】:
我个人觉得os 和os.path 之间的划分有点不一致。根据文档,os.path 应该只是与特定平台的路径一起使用的模块的别名(即,在 OS X、Linux 和 BSD 上,你会得到posixpath,在 Windows 或古老的 Mac 上你会得到)会得到别的东西)。
listdir 函数不对路径 本身进行操作,而是对路径标识的目录进行操作。 os.path 中的大部分函数都在实际路径上运行,而不在文件系统上。
这意味着os.path中的许多函数是字符串操作函数,而os中的大多数函数是IO函数/系统调用。
例子:
os.path.join、os.path.dirname、os.path.splitext,只是字符串操作函数。
os.listdir、os.getcwd、os.remove、os.stat 都是系统调用,实际上是触及文件系统。
反例:
os.path 有exists、getmtime、islink 和其他基本上是os.stat 的包装器,并触及文件系统。我认为它们分类错误,但其他人可能不同意。今日趣事:您不会在库文档的顶层找到这些模块,但您实际上可以为任何平台导入 os.path 的版本,而无需实际在那个平台上运行。这在os.path 的文档中有记录,
但是,如果您想操作始终采用其中一种不同格式的路径,您也可以导入和使用各个模块。它们都有相同的界面:
posixpath用于 UNIX 样式的路径ntpath用于 Windows 路径macpath用于旧式 MacOS 路径os2emxpath用于 OS/2 EMX 路径
你不能对os做同样的事情,这没有任何意义。
【讨论】: