在学习编程过程中, 我一直遵循一个简单的思路, 更好的写代码, 写出更好的代码, python 作为我的主要开发工具, 有必要深入了解下 python 标准库.
更好的利用标准库中已经有的轮子, 提升自己的开发效率.
标准库的源码一定是最 pythonic, 学习其 pythonic 的编码风格.
该系列文章全部基于 python3.5, 交互式环境全都基于 Ipython 5.1.0
文章采用标准库常用功能介绍, 源码分析 (挑选重要的), 应用场景介绍(工程实践较少, 见谅 ^^) 为组织方式.
os 模块
os 模块是 python 与操作系统交互的主要模块, os 模块可以弥补操作系统之间差异带来的编程方面的不同. 工作中使用的主要场景就是在文件路径描述, windows 和 linux 之间文件路径的不同.
操作系统相关
os.sep 操作系统特定文件路径分隔符
- In [2]: os.sep
- Out[2]: '/'
os.name 可移植操作系统接口标识, 是操作系统 API 一系列相互关联标准的总称, windows 是 nt Linux/Unix 是 posix.
- In [3]: os.name
- Out[3]: 'posix'
os.defpath 可执行文件的默认搜索路径
- In [9]: os.defpath
- Out[9]: ':/bin:/usr/bin'
os.curdir 当前路径的简称
- In [10]: os.curdir
- Out[10]: '.'
os.pardir 父级路径的简称
- In [11]: os.pardir
- Out[11]: '..'
os.uname() 获取当前操作系统的详细信息
- In [12]: os.uname()
- Out[12]: posix.uname_result(sysname='Linux', nodename='chao', release='4.10.0-42-generic', version='#46-Ubuntu SMP Mon Dec 4 14:38:01 UTC 2017', machine='x86_64')
和环境变量相关的
os.environ 获取当前环境变量
- In [13]: os.environ
- Out[13]: environ({'LC_PAPER': 'zh_CN.UTF-8', 'SSH_AUTH_SOCK': '/run/user/1000/keyring/ssh',...})
获取某个环境的具体值
- In [14]: os.environ.get('LC_PAPER')
- Out[14]: 'zh_CN.UTF-8'
- In [16]: os.getenv('LC_PAPER')
- Out[16]: 'zh_CN.UTF-8'
设置环境变量
- In [17]: os.environ['hello']='world'
- In [19]: os.getenv('hello')
- Out[19]: 'world'
与文件夹相关
os.getcwd() 获取当前工作路径
- In [157]: os.getcwd()
- Out[157]: '/home/zhangwenchao/os_test'
os.mkdir 创建文件夹
- In [119]: os.mkdir('./what')
- In [120]: ls
- f1 f2 hello/ what/
os.rmdir 删除文件夹
- In [131]: ls
- f1 f2 hello/ what/
- In [132]: os.rmdir('hello')
- In [133]: ls
- f1 f2 what/
os.listdir 以列表的形式展现当前目录或指定目录下的文件
- In [130]: os.listdir()
- Out[130]: ['hello', 'f1', 'f2', 'what']
- In [131]: ls
- f1 f2 hello/ what/
os.rename 重命名文件
- In [148]: ls
- f1 f2 hello/ what/
- In [149]: os.rename('./hello','world')
- In [150]: ls
- f1 f2 what/ world/
os.remove 删除文件
- In [150]: ls
- f1 f2 what/ world/
- In [151]: os.remove('f1')
- In [152]: ls
- f2 what/ world/
有人会问, 删除文件是这样, 那么新建文件呢, python 新建文件是通过 open 函数实现的
- In [153]: f3 = open('./f3','w')
- In [154]: ls
- f2 f3 what/ world/
- In [155]: f3.close()
- In [156]: ls
- f2 f3 what/ world/
os.path 和路径相关的
获取某个路径的绝对路径
- In [27]: os.path.abspath(path='.')
- Out[27]: '/home/zhangwenchao/os_test'
获取路径的基本名称
- In [31]: os.path.basename('/home/zhangwenchao')
- Out[31]: 'zhangwenchao'
获得路径列表中共同路径最长的那一部分
- In [37]: os.path.commonpath(['/home/zhangwenchao','/home/zhangwenchao/chaozi','/home/zhangwenchao/hello'])
- Out[37]: '/home/zhangwenchao'
获得路径的起始目录
- In [38]: os.path.dirname('/home/zhangwenchao')
- Out[38]: '/home'
看路径是否在系统中存在
- In [40]: os.path.exists('/home/zhangwenchao')
- Out[40]: True
- In [41]: os.path.exists('/home/zhangwenchao/haha')
- Out[41]: False
翻译家目录的绝对路径
- In [49]: os.path.expanduser(path='~')
- Out[49]: '/home/zhangwenchao'
将路径中的'~'换成家目录的绝对路径
- In [55]: os.path.expanduser('~/os_test')
- Out[55]: '/home/zhangwenchao/os_test'
查看最后一次进入该目录的时间
- In [58]: os.path.getatime('.')
- Out[58]: 1522289333.369126
查看最后一次修改该目录的时间
- In [60]: os.path.getmtime('.')
- Out[60]: 1522289329.4610949
查看该路径的大小
- In [61]: os.path.getsize('/home/zhangwenchao/os_test')
- Out[61]: 4096
查看该路径是文件还是文件夹
- In [62]: os.path.isdir('/home/zhangwenchao/os_test')
- Out[62]: True
- In [63]: os.path.isfile('/home/zhangwenchao/os_test')
- Out[63]: False
路径拼接, 根据不同操作系统采用不同的文件拼接符, 比如我现在用的是 linux 系统就会采用'/'拼接
- In [64]: os.path.join('/home','hello','world')
- Out[64]: '/home/hello/world'
规范系统的文件路径形式
- In [70]: os.path.normpath('c:\home\ha')
- Out[70]: 'c:\\home\\ha'
- In [72]: os.path.normpath('/home//ha')
- Out[72]: '/home/ha'
从某个路径开始计算相对路径, 比如, 当前位于 / home/zhangwenchao/os_test
- In [79]: os.path.relpath('/home')
- Out[79]: '../..'
- In [80]: os.path.relpath('/home/work')
- Out[80]: '../../work'
- In [81]: os.path.relpath('/home/work','/home')
- Out[81]: 'work'
- In [82]: os.path.relpath('/home/work','/')
- Out[82]: 'home/work'
os.path.split(path) 把路径分割成 dirname 和 basename, 返回一个元组
- In [84]: os.path.split('/home/work/hello')
- Out[84]: ('/home/work', 'hello')
分割文件的扩展名, 可以用来获取文件的扩展名
- In [85]: os.path.splitext('/home/work/hello.txt')
- Out[85]: ('/home/work/hello', '.txt')
- In [87]: os.path.splitext('/home/work/hello-txt')
- Out[87]: ('/home/work/hello-txt', '')
os.path.samefile(path1, path2) 判断目录或文件是否相同
- In [88]: %mkdir hello
- In [89]: ls
- hello/
- In [90]: os.path.samefile('./hello','.')
- Out[90]: False
- In [91]: os.path.samefile('./hello','./hello')
- Out[91]: True
来源: http://www.jianshu.com/p/ed0774f82816