自學Python:python中的OS模塊與pickle模塊

OS模塊

OS就是Operating System的縮寫,意爲操作系統,這可是一個非常高大上的模塊,因爲在python中,對於文件系統的訪問就是通過OS模塊來實現的。我們所知道常用的操作系統就有Windows、Mac OS、Linux、UNIX等,這些操作系統底層對於文件系統的訪問工作原理是不一樣的,因此你可能就要針對不同的系統來考慮使用哪些文件系統模塊,這樣的做法是非常麻煩的,因爲如果程序的運行環境一旦改變,你就要相應的去修改大量的代碼來應付。

但是python是一種跨平臺的語言,同樣的源代碼在不同的操作系統不需要修改就可以同樣實現,有了OS模塊,不需要關心什麼操作系統下使用什麼模塊,OS模塊會幫你選擇正確的模塊並調用。

下面是OS模塊中關於文件/目錄常用的函數的使用方法:

函數名 使用方法
getcwd() 返回當前的工作目錄
chdir(path) 改變當前工作目錄
listdir(path=’.’) 列舉指定目錄中的文件名(‘.’表示當前目錄,’..'表示上一級目錄)
mkdir(path) 創建一個單層空目錄,如果該目錄已經存在則會拋出異常
makedirs(path) 遞歸的創建多層目錄,如果內層目錄已經存在則報錯,('E:/a/b’和’E:/a/c’不會衝突)
remove(path) 刪除文件
rmdir(path) 刪除一個單層目錄,如果目錄非空則拋出異常
removedirs(path) 遞歸的刪除一系列目錄,從子目錄到父目錄逐層嘗試刪除,遇到非空目錄拋出異常
rename(old, new) 重命名
system(command) 運行系統的shell命令
以下是支持路徑操作中常用到的一些定義,支持所有平臺
os.curdir 指代當前目錄 == (’.’)
os.pardir 指代上一級目錄 == (’..’)
os.sep 輸出操作系統特定的路徑分隔符(在windows下爲’\\’,Linux下爲‘/’)
os.linesep 當前平臺使用的行終止符(在Windows下爲’\r\n’,Linux下爲’\n’)
os.name 指代當前實用的操作系統(包括’posix’、‘nt’、‘mac’、‘os2’、‘ce’、‘java’)

1、getcwd()
有些情況下我們需要獲得應用程序當前的工作目錄(比如要保存臨時文件),那麼可以使用getcwd()函數獲得:

>>> import os
>>> os.getcwd()
'E:\\Program Files (x86)\\python37-32'

在這裏插入圖片描述
2、chdir(path)

>>> os.chdir('E:/a')
>>> os.getcwd()
'E:\\a'

在這裏插入圖片描述
3、listdir(path = ‘.’)
有時候你可能需要知道當前工作目錄下有哪些文件和子目錄,那麼listdir()函數可以幫你列舉出來。path參數用於指定列舉的目錄,默認值是’.’,代表根目錄,也可以使用’..'代表上一級目錄:

>>> os.chdir('E:/Program Files')
>>> os.listdir(path = '.')
['Tencent', 'YouKu']

在這裏插入圖片描述

os.listdir('./Tencent')

在這裏插入圖片描述
4、mkdir(path)
mkdir()函數用於創建文件夾,如果該文件夾存在,則拋出FileExistsError異常:
在這裏插入圖片描述
在這裏插入圖片描述
5、makedirs(path)
makedirs()函數可用於創建多層目錄,用過linux系統的都知道,在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()函數用於刪除指定的文件,注意是刪除文件,不是刪除目錄。如果需要刪除目錄,則用rmdir()函數;如果要刪除多層目錄,則用removedirs()函數。

>>> 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()函數用於重命名文件或者文件夾

>>> 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系統中非常好用,在一些運維自動化腳本中用的非常頻繁,當然在windows中也可以用,幾乎每個操作系統都會提供一些小工具,system()函數用於使用這些小工具,她或使用相應的命令將這些工具調出來,比如說windows中的計算器,在dos窗口我們需要使用calc命令調出,因此,在python中我們可以使用system()函數調用計算器

>>> os.system('calc')

在這裏插入圖片描述
9、walk(top)
最後是walk()函數,這個函數在有些時候確實非常有用,可以省去很多麻煩。該函數的作用是遍歷top參數指定路徑下的所有子目錄,並將結果返回一個三元組(路徑,[包含目錄],[包含文件])。看一下下面的例子:

>>> 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,它可以完成一些針對路徑名的操作。其常用的函數方法有:

函數名 使用方法
basename(path) 去掉目錄路徑,單獨返回文件名
dirname(path) 去掉文件名,單獨返回目錄路徑
join(path1[,path2[, …]]) 將path1和path2各部分組合成一個路徑名
split(path) 分割文件名與路徑,返回(f_path, f_name)元祖。如果完全使用目錄,他也會講最後一個目錄作爲文件名分離,且不會判斷文件或者目錄是否存在
splitext(path) 分離文件名與擴展名,返回(f_name, f_extension)元祖
getsize(file) 返回指定文件的尺寸,大小爲字節
getatime(file) 返回指定文件最近的訪問時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
getctime(file) 返回指定文件的創建時間(浮點型秒數,可用time模塊的gmtime()或者localtime()換算)
getmtime(file) 返回指定文件最新的修改時間(浮點型秒數,可用time模塊的gmtime()或者localtime()換算)

以下爲函數返回True或者False

函數名 使用方法
exists(path) 判斷指定路徑(目錄或者文件)是否存在
isabs(path) 判斷指定路徑是否爲絕對路徑
isdir(path) 判斷指定路徑是否存在且是一個目錄
isfile(path) 判斷指定路徑是否存在且是一個文件
islink(path) 判斷指定路徑是否存在且是一個符號鏈接(軟連接)
ismount(path) 判斷指定路徑是否存在且是一個掛載點
samefile(path1, path2) 判斷path1和path2兩個路徑是否指向同一個文件

1、basename(path)和dirname(path)
basename()和dirname()函數分別用於獲得文件名和路徑名:

>>> 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()函數跟BIF的那個join()函數不同,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()函數都用於分割路徑,split()函數分割路徑和文件名(如果完全使用目錄,他也會將最後一個目錄作爲文件名分離,且不會判斷文件或者目錄是否存在);splitext()函數則是用於分割文件名和擴展名:

>>> 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()函數用於獲取文件的尺寸,返回值是以字節爲單位的:

>>> os.path.getsize('E:/A/TEST_DIR/new_test.txt')
2170

在這裏插入圖片描述
5、getatime()、getctime()、getmtime()
這三個函數分別用於獲取文件的最近訪問時間、創建時間和修改時間。不過返回值是浮點型秒數,可用time模塊的gmtime()或localtime()函數換算:

>>> 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 被創建的時間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
E:/A/TEST_DIR/new_test.txt 被創建的時間是: 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提供的一個標準模塊,使用這個模塊,可以非常容易地將列表、字典這類複雜數據類型存儲爲文件了。
pickle就是泡菜,醃菜的意思,用官方文檔中的話說,這是一個令人驚歎的模塊,它幾乎可以把所有python的對象都轉化爲二進制的形式存放,這個過程稱爲pickling,那麼從二進制形式轉化會對象的過程稱爲unpickling。
我們來舉一個將列表數據保存到文件的例子:

import pickle as p

my_list = [123, 345, 'pythoner', [12, 34, 56]]

# 使用二進制可寫的方式創建一個文件
pickle_file = open('E:/A/TEST_DIR/C/my_list.pkl', 'wb')

# 使用pickle模塊的dump方法將數據保存到創建的.pkl文件中
p.dump(my_list, pickle_file)

# 關閉文件
pickle_file.close()

運行這段python代碼之後,就會出現my_list.pkl這個文件,裏面存儲的數據格式爲二進制,所以要打開的話要以二進制方式打開,還有這個文件的後綴名是隨意的,使用pkl是爲了方便記憶與分辨。

在這裏插入圖片描述
在這裏插入圖片描述
我們要想在python中將之前保存到文件的列表數據還原,就需要在python中以二進制可讀的方式打開pkl文件,隨後再使用pickle模塊的load方法將數據加載進來

import pickle as p

# 使用二進制可讀的方式打開之前保存列表數據的pkl文件
pickle_file = open('E:/A/TEST_DIR/C/my_list.pkl', 'rb')

# 調用pickle模塊的load方法將列表數據加載到my_list對象中
my_list = p.load(pickle_file)
print(my_list)

運行這段代碼就可以得到我們之前的列表了
在這裏插入圖片描述
利用pickle模塊不但可以保存列表數據,其實他可以保存任何你能想象到的東西!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章