在學(xué)習(xí)編程過程中,我一直遵循一個簡單的思路,更好的寫代碼,寫出更好的代碼,python作為我的主要開發(fā)工具,有必要深入了解下python標(biāo)準(zhǔn)庫.
- 更好的利用標(biāo)準(zhǔn)庫中已經(jīng)有的輪子,提升自己的開發(fā)效率.
- 標(biāo)準(zhǔn)庫的源碼一定是最pythonic,學(xué)習(xí)其pythonic的編碼風(fēng)格.
該系列文章全部基于python3.5,交互式環(huán)境全都基于Ipython 5.1.0
文章采用標(biāo)準(zhǔn)庫常用功能介紹,源碼分析(挑選重要的),應(yīng)用場景介紹(工程實踐較少,見諒^^)為組織方式.
os模塊
os模塊是python與操作系統(tǒng)交互的主要模塊,os模塊可以彌補(bǔ)操作系統(tǒng)之間差異帶來的編程方面的不同.工作中使用的主要場景就是在文件路徑描述,windows和linux 之間文件路徑的不同.
操作系統(tǒng)相關(guān)
os.sep操作系統(tǒng)特定文件路徑分隔符
In [2]: os.sep
Out[2]: '/'
os.name 可移植操作系統(tǒng)接口標(biāo)識,是操作系統(tǒng)API一系列相互關(guān)聯(lián)標(biāo)準(zhǔn)的總稱,windows是nt Linux/Unix是posix.
In [3]: os.name
Out[3]: 'posix'
os.defpath 可執(zhí)行文件的默認(rèn)搜索路徑
In [9]: os.defpath
Out[9]: ':/bin:/usr/bin'
os.curdir 當(dāng)前路徑的簡稱
In [10]: os.curdir
Out[10]: '.'
os.pardir 父級路徑的簡稱
In [11]: os.pardir
Out[11]: '..'
os.uname() 獲取當(dāng)前操作系統(tǒng)的詳細(xì)信息
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')
和環(huán)境變量相關(guān)的
os.environ 獲取當(dāng)前環(huán)境變量
In [13]: os.environ
Out[13]: environ({'LC_PAPER': 'zh_CN.UTF-8', 'SSH_AUTH_SOCK': '/run/user/1000/keyring/ssh',...})
獲取某個環(huán)境的具體值
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'
設(shè)置環(huán)境變量
In [17]: os.environ['hello']='world'
In [19]: os.getenv('hello')
Out[19]: 'world'
與文件夾相關(guān)
os.getcwd() 獲取當(dāng)前工作路徑
In [157]: os.getcwd()
Out[157]: '/home/zhangwenchao/os_test'
os.mkdir創(chuàng)建文件夾
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 以列表的形式展現(xiàn)當(dāng)前目錄或指定目錄下的文件
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函數(shù)實現(xiàn)的
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 和路徑相關(guān)的
獲取某個路徑的絕對路徑
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'
看路徑是否在系統(tǒng)中存在
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'
查看最后一次進(jìn)入該目錄的時間
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
路徑拼接,根據(jù)不同操作系統(tǒng)采用不同的文件拼接符,比如我現(xiàn)在用的是linux系統(tǒng)就會采用'/'拼接
In [64]: os.path.join('/home','hello','world')
Out[64]: '/home/hello/world'
規(guī)范系統(tǒng)的文件路徑形式
In [70]: os.path.normpath('c:\home\ha')
Out[70]: 'c:\\home\\ha'
In [72]: os.path.normpath('/home//ha')
Out[72]: '/home/ha'
從某個路徑開始計算相對路徑,比如,當(dāng)前位于/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')
分割文件的擴(kuò)展名,可以用來獲取文件的擴(kuò)展名
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