os.path
模块似乎是所有路径相关功能的默认模块。然而,listdir()
功能是os
模块的一部分,而不是os.path
模块,即使它接受路径作为其输入。为什么要做这个设计决定?为什么listdir()函数是os模块的一部分而不是os.path?
1
A
回答
11
我个人觉得os
和os.path
之间的区别有点不一致。根据文档,os.path
应该只是一个模块的别名,它适用于特定平台的路径(例如,在OS X,Linux和BSD上,您将获得posixpath
,在Windows或古老的Mac上,您将获得其他东西)。
>>> import os >>> help(os) Help on module os: NAME os - OS routines for Mac, NT, or Posix depending on what system we're on. ... >>> help(os.path) Help on module posixpath: NAME posixpath - Common operations on Posix pathnames.
的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
做同样的事情,它不会做任何se NSE。
相关问题
- 1. 什么时候是一个scala部分函数而不是部分函数?
- 2. 无法安装模块的'os'和'os.path'
- 3. 为什么ActiveRecord不是一个模块?
- 4. 块为什么不是python标准库的一部分?
- 5. os.path如何映射到posixpath.pyc而不是os/path.py?
- 6. 为什么const有时是函数签名的一部分?
- 7. 在iOS/Swift中,MatrixHelper是什么模块的一部分?
- 8. 为什么Math是一个对象而String是一个函数?
- 9. 为什么选择“分享一切”而不是“分享一切”?
- 10. 为什么这个函数console.log而不是一次20次?
- 11. 函数被调用n + 1次而不是一次 - 为什么?
- 12. wordpress:add_action:为什么第二个参数是一个数组而不是函数名
- 13. 在JavaScript中,什么是构造函数?而什么不是?
- 14. 为什么__import __()正在返回包而不是模块?
- 15. 什么是函数参数的一部分?
- 16. 为什么Angular 2是用CommonJs模块格式编写的,而不是AMD?
- 17. 为什么“Extracted Interfaces”是内部的而不是公共的?
- 18. 为什么我的函数返回一个声明,而不是“而”
- 19. 为什么os.path使用'\'和'/'?
- 20. 为什么typeof被称为运算符而不是函数?
- 21. 为什么Scrollspy的目标是外部div而不是ul?
- 22. Python os.path是ntpath,怎么样?
- 23. 为什么函数模板不能部分专用?
- 24. 函数将输出nan而不是数字,为什么?
- 25. 为什么main()函数的argc在ESP + 4而不是ESP + 0?
- 26. 为什么主函数中的段错误,而不是外部错误?
- 27. 为什么我应该使用块范围而不是函数范围?
- 28. 函数try块的用途是什么?
- 29. 为什么Angular 2将模块名称命名为模块NgModule,而不仅仅是模块
- 30. 为什么retainCount是0而不是1?
很好的答案。谢谢。我同意你在os.path中放置非字符串操作。可能还有另一个原因。 – euphoria83 2012-04-23 06:58:38
@ euphoria83:“不破坏现有代码”是一个非常好的理由。尽管他们可能已经将它移到了Python 3中。 – 2012-04-23 08:37:42