在学习编程过程中,我一直遵循一个简单的思路,更好的写代码,写出更好的代码,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