OS模塊
OS就是Operating System的縮寫(xiě),意為操作系統(tǒng),這可是一個(gè)非常高大上的模塊,因?yàn)樵趐ython中,對(duì)于文件系統(tǒng)的訪問(wèn)就是通過(guò)OS模塊來(lái)實(shí)現(xiàn)的。我們所知道常用的操作系統(tǒng)就有Windows、Mac OS、Linux、UNIX等,這些操作系統(tǒng)底層對(duì)于文件系統(tǒng)的訪問(wèn)工作原理是不一樣的,因此你可能就要針對(duì)不同的系統(tǒng)來(lái)考慮使用哪些文件系統(tǒng)模塊,這樣的做法是非常麻煩的,因?yàn)槿绻绦虻倪\(yùn)行環(huán)境一旦改變,你就要相應(yīng)的去修改大量的代碼來(lái)應(yīng)付。
但是python是一種跨平臺(tái)的語(yǔ)言,同樣的源代碼在不同的操作系統(tǒng)不需要修改就可以同樣實(shí)現(xiàn),有了OS模塊,不需要關(guān)心什么操作系統(tǒng)下使用什么模塊,OS模塊會(huì)幫你選擇正確的模塊并調(diào)用。
下面是OS模塊中關(guān)于文件/目錄常用的函數(shù)的使用方法:
| 函數(shù)名 | 使用方法 |
|---|---|
| getcwd() | 返回當(dāng)前的工作目錄 |
| chdir(path) | 改變當(dāng)前工作目錄 |
| listdir(path=’.’) | 列舉指定目錄中的文件名(‘.’表示當(dāng)前目錄,’..'表示上一級(jí)目錄) |
| mkdir(path) | 創(chuàng)建一個(gè)單層空目錄,如果該目錄已經(jīng)存在則會(huì)拋出異常 |
| makedirs(path) | 遞歸的創(chuàng)建多層目錄,如果內(nèi)層目錄已經(jīng)存在則報(bào)錯(cuò),('E:/a/b’和’E:/a/c’不會(huì)沖突) |
| remove(path) | 刪除文件 |
| rmdir(path) | 刪除一個(gè)單層目錄,如果目錄非空則拋出異常 |
| removedirs(path) | 遞歸的刪除一系列目錄,從子目錄到父目錄逐層嘗試刪除,遇到非空目錄拋出異常 |
| rename(old, new) | 重命名 |
| system(command) | 運(yùn)行系統(tǒng)的shell命令 |
| 以下是支持路徑操作中常用到的一些定義,支持所有平臺(tái) | |
|---|---|
| os.curdir | 指代當(dāng)前目錄 == (’.’) |
| os.pardir | 指代上一級(jí)目錄 == (’..’) |
| os.sep | 輸出操作系統(tǒng)特定的路徑分隔符(在windows下為’\\’,Linux下為‘/’) |
| os.linesep | 當(dāng)前平臺(tái)使用的行終止符(在Windows下為’\r\n’,Linux下為’\n’) |
| os.name | 指代當(dāng)前實(shí)用的操作系統(tǒng)(包括’posix’、‘nt’、‘mac’、‘os2’、‘ce’、‘java’) |
1、
getcwd()
有些情況下我們需要獲得應(yīng)用程序當(dāng)前的工作目錄(比如要保存臨時(shí)文件),那么可以使用getcwd()函數(shù)獲得:
>>> import os
>>> os.getcwd()
'E:\\Program Files (x86)\\python37-32'
>>> os.chdir('E:/a')
>>> os.getcwd()
'E:\\a'
3、listdir(path = ‘.’)
有時(shí)候你可能需要知道當(dāng)前工作目錄下有哪些文件和子目錄,那么listdir()函數(shù)可以幫你列舉出來(lái)。path參數(shù)用于指定列舉的目錄,默認(rèn)值是’.’,代表根目錄,也可以使用’..'代表上一級(jí)目錄:
>>> os.chdir('E:/Program Files')
>>> os.listdir(path = '.')
['Tencent', 'YouKu']
os.listdir('./Tencent')
4、mkdir(path)
mkdir()函數(shù)用于創(chuàng)建文件夾,如果該文件夾存在,則拋出FileExistsError異常:
5、makedirs(path)
makedirs()函數(shù)可用于創(chuàng)建多層目錄,用過(guò)linux系統(tǒng)的都知道,在linux中的話,要建立多層目錄可以使用
mkdir /A/B/C/D -p
>>> os.chdir('E:/a')
>>> os.listdir()
>>> ['B']
>>> os.makedirs('E:/a/A/B/C')
>>> os.listdir('E:/a/')
['A', 'B']
>>> os.listdir('E:/a/A/B/')
['C']
6、remove(path)、rmdir(path)和removedirs(path)
remove()函數(shù)用于刪除指定的文件,注意是刪除文件,不是刪除目錄。如果需要?jiǎng)h除目錄,則用rmdir()函數(shù);如果要?jiǎng)h除多層目錄,則用removedirs()函數(shù)。
>>> os.chdir('E:/A/A/B/C')
>>> os.listdir()
['test.txt']
>>> os.remove('test.txt')
>>> os.listdir()
[]
>>> os.chdir('E:/A/A/B/')
>>> os.listdir()
['C']
>>> os.rmdir('C')
>>> os.listdir()
[]
>>> os.chdir('E:/A/')
>>> os.removedirs('E:/A/A/B')
>>> os.listdir()
['B']
7、rename(old, new)
rename()函數(shù)用于重命名文件或者文件夾
>>> os.listdir()
['B']
>>> os.rename('B', 'TEST_DIR')
>>> os.listdir()
['TEST_DIR']
>>> os.chdir('TEST_DIR')
>>> os.listdir()
['C', 'test2.txt']
>>> os.rename('test2.txt', 'new_test.txt')
>>> os.listdir()
['C', 'new_test.txt']
8、system(command)
os模塊的這個(gè)方法我個(gè)人感覺(jué)在linux系統(tǒng)中非常好用,在一些運(yùn)維自動(dòng)化腳本中用的非常頻繁,當(dāng)然在windows中也可以用,幾乎每個(gè)操作系統(tǒng)都會(huì)提供一些小工具,system()函數(shù)用于使用這些小工具,她或使用相應(yīng)的命令將這些工具調(diào)出來(lái),比如說(shuō)windows中的計(jì)算器,在dos窗口我們需要使用calc命令調(diào)出,因此,在python中我們可以使用system()函數(shù)調(diào)用計(jì)算器
>>> os.system('calc')
9、walk(top)
最后是walk()函數(shù),這個(gè)函數(shù)在有些時(shí)候確實(shí)非常有用,可以省去很多麻煩。該函數(shù)的作用是遍歷top參數(shù)指定路徑下的所有子目錄,并將結(jié)果返回一個(gè)三元組(路徑,[包含目錄](méi),[包含文件])。看一下下面的例子:
>>> os.getcwd()
'E:\\A'
>>> for i in os.walk('.'):
print(i)
('.', ['TEST_DIR', 'TEST_DIR2'], [])
('.\\TEST_DIR', ['C'], ['new_test.txt'])
('.\\TEST_DIR\\C', ['gd0306'], ['test.png'])
('.\\TEST_DIR\\C\\gd0306', [], ['gd0306.txt'])
('.\\TEST_DIR2', ['NEW_DIR'], ['test2.txt'])
('.\\TEST_DIR2\\NEW_DIR', [], ['test3.txt'])
os.path
除了上面提到的os模塊的一些功能外,還有一個(gè)強(qiáng)大的模塊是os.path,它可以完成一些針對(duì)路徑名的操作。其常用的函數(shù)方法有:
| 函數(shù)名 | 使用方法 |
|---|---|
| basename(path) | 去掉目錄路徑,單獨(dú)返回文件名 |
| dirname(path) | 去掉文件名,單獨(dú)返回目錄路徑 |
| join(path1[,path2[, …]]) | 將path1和path2各部分組合成一個(gè)路徑名 |
| split(path) | 分割文件名與路徑,返回(f_path, f_name)元祖。如果完全使用目錄,他也會(huì)講最后一個(gè)目錄作為文件名分離,且不會(huì)判斷文件或者目錄是否存在 |
| splitext(path) | 分離文件名與擴(kuò)展名,返回(f_name, f_extension)元祖 |
| getsize(file) | 返回指定文件的尺寸,大小為字節(jié) |
| getatime(file) | 返回指定文件最近的訪問(wèn)時(shí)間(浮點(diǎn)型秒數(shù),可用time模塊的gmtime()或localtime()函數(shù)換算) |
| getctime(file) | 返回指定文件的創(chuàng)建時(shí)間(浮點(diǎn)型秒數(shù),可用time模塊的gmtime()或者localtime()換算) |
| getmtime(file) | 返回指定文件最新的修改時(shí)間(浮點(diǎn)型秒數(shù),可用time模塊的gmtime()或者localtime()換算) |
以下為函數(shù)返回True或者False
| 函數(shù)名 | 使用方法 |
|---|---|
| exists(path) | 判斷指定路徑(目錄或者文件)是否存在 |
| isabs(path) | 判斷指定路徑是否為絕對(duì)路徑 |
| isdir(path) | 判斷指定路徑是否存在且是一個(gè)目錄 |
| isfile(path) | 判斷指定路徑是否存在且是一個(gè)文件 |
| islink(path) | 判斷指定路徑是否存在且是一個(gè)符號(hào)鏈接(軟連接) |
| ismount(path) | 判斷指定路徑是否存在且是一個(gè)掛載點(diǎn) |
| samefile(path1, path2) | 判斷path1和path2兩個(gè)路徑是否指向同一個(gè)文件 |
1、basename(path)和dirname(path)
basename()和dirname()函數(shù)分別用于獲得文件名和路徑名:
>>> os.path.dirname(r'E:/A/TEST_DIR/new_test.txt')
'E:/A/TEST_DIR'
>>> os.path.basename(r'E:/A/TEST_DIR/new_test.txt')
'new_test.txt'
2、join(path1[,path2[, …]])
join()函數(shù)跟BIF的那個(gè)join()函數(shù)不同,os.path.join()是用于將路徑名和文件名組合成一個(gè)完整的路徑,這個(gè)目錄路徑和文件都可以不存在:
>>> os.path.join(r'E:/A/TEST_DIR', 'gd.txt')
'E:/A/TEST_DIR\\gd.txt'
>>> os.path.join(r'E:/A/TEST_DIR3', 'gd.txt')
'E:/A/TEST_DIR3\\gd.txt'
3、split(path)和splitext(path)
split()和splitext()函數(shù)都用于分割路徑,split()函數(shù)分割路徑和文件名(如果完全使用目錄,他也會(huì)將最后一個(gè)目錄作為文件名分離,且不會(huì)判斷文件或者目錄是否存在);splitext()函數(shù)則是用于分割文件名和擴(kuò)展名:
>>> os.path.split('E:/A/TEST_DIR/new_test.txt')
('E:/A/TEST_DIR', 'new_test.txt')
>>> os.path.splitext('E:/A/TEST_DIR/new_test.txt')
('E:/A/TEST_DIR/new_test', '.txt')
4、getsize(file)
getsize()函數(shù)用于獲取文件的尺寸,返回值是以字節(jié)為單位的:
>>> os.path.getsize('E:/A/TEST_DIR/new_test.txt')
2170
5、getatime()、getctime()、getmtime()
這三個(gè)函數(shù)分別用于獲取文件的最近訪問(wèn)時(shí)間、創(chuàng)建時(shí)間和修改時(shí)間。不過(guò)返回值是浮點(diǎn)型秒數(shù),可用time模塊的gmtime()或localtime()函數(shù)換算:
>>> import time
>>> temp = time.localtime(os.path.getatime('E:/A/TEST_DIR/new_test.txt'))
>>> print('E:/A/TEST_DIR/new_test.txt 被訪問(wèn)的時(shí)間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
E:/A/TEST_DIR/new_test.txt 被訪問(wèn)的時(shí)間是: 23 May 2019 22: 12: 44
>>>
>>> temp = time.localtime(os.path.getctime('E:/A/TEST_DIR/new_test.txt'))
>>> print('E:/A/TEST_DIR/new_test.txt 被創(chuàng)建的時(shí)間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
E:/A/TEST_DIR/new_test.txt 被創(chuàng)建的時(shí)間是: 23 May 2019 20: 49: 56
>>>
>>> temp = time.localtime(os.path.getmtime('E:/A/TEST_DIR/new_test.txt'))
>>> print('E:/A/TEST_DIR/new_test.txt 被修改的時(shí)間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
E:/A/TEST_DIR/new_test.txt 被修改的時(shí)間是: 23 May 2019 22: 12: 44
pickle:泡菜?
pickle是python提供的一個(gè)標(biāo)準(zhǔn)模塊,使用這個(gè)模塊,可以非常容易地將列表、字典這類復(fù)雜數(shù)據(jù)類型存儲(chǔ)為文件了。
pickle就是泡菜,腌菜的意思,用官方文檔中的話說(shuō),這是一個(gè)令人驚嘆的模塊,它幾乎可以把所有python的對(duì)象都轉(zhuǎn)化為二進(jìn)制的形式存放,這個(gè)過(guò)程稱為pickling,那么從二進(jìn)制形式轉(zhuǎn)化會(huì)對(duì)象的過(guò)程稱為unpickling。
我們來(lái)舉一個(gè)將列表數(shù)據(jù)保存到文件的例子:
import pickle as p
my_list = [123, 345, 'pythoner', [12, 34, 56]]
# 使用二進(jìn)制可寫(xiě)的方式創(chuàng)建一個(gè)文件
pickle_file = open('E:/A/TEST_DIR/C/my_list.pkl', 'wb')
# 使用pickle模塊的dump方法將數(shù)據(jù)保存到創(chuàng)建的.pkl文件中
p.dump(my_list, pickle_file)
# 關(guān)閉文件
pickle_file.close()
運(yùn)行這段python代碼之后,就會(huì)出現(xiàn)my_list.pkl這個(gè)文件,里面存儲(chǔ)的數(shù)據(jù)格式為二進(jìn)制,所以要打開(kāi)的話要以二進(jìn)制方式打開(kāi),還有這個(gè)文件的后綴名是隨意的,使用pkl是為了方便記憶與分辨。
我們要想在python中將之前保存到文件的列表數(shù)據(jù)還原,就需要在python中以二進(jìn)制可讀的方式打開(kāi)pkl文件,隨后再使用pickle模塊的load方法將數(shù)據(jù)加載進(jìn)來(lái)
import pickle as p
# 使用二進(jìn)制可讀的方式打開(kāi)之前保存列表數(shù)據(jù)的pkl文件
pickle_file = open('E:/A/TEST_DIR/C/my_list.pkl', 'rb')
# 調(diào)用pickle模塊的load方法將列表數(shù)據(jù)加載到my_list對(duì)象中
my_list = p.load(pickle_file)
print(my_list)
運(yùn)行這段代碼就可以得到我們之前的列表了
利用pickle模塊不但可以保存列表數(shù)據(jù),其實(shí)他可以保存任何你能想象到的東西!!!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

