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

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
