python常用模組(模組和包的解釋,time模組,sys模組,random模組,os模組,json和pickle序列化模組)
1.1模組
什麼是模組:
在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。
為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,在python中。一個.py檔案就稱為一個模組(Module)
使用模組的好處:
提高了程式碼的可維護性。
其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。我們編寫程式的時候也經常引用其他模組,包括python的內建的模組和第三方模組。
包(package)的概念:
如果不同的人編寫的模組名相同怎麼辦?
為了避免模組名衝突,python有引入了按目錄組織模組的方法,稱為包(Package)
一個abc.py的檔案就是一個名字叫abc的模組。
假設,我們的abc和qaz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突,方法是選擇一個頂層的包名比如MyUser。
引入包以後,只要頂層的包名不與別人 衝突,那所有的模組都不會與別人衝突。現在abc.py模組的名字就變成了MyUser.abc,qaz模組名字就變成了MyUser.qaz.
多級包結構:包.包.模組
注:每個包目錄下面都會有一個——init——.py檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是一個包。——init——.py可以是空檔案,裡面可以有程式程式碼,因為——init——.py就是一個模組,模組名就是MyUser
注:我們自已編寫模組名時,儘量不要與內建函式或則模組名字衝突。如同與系統的模組同名,否則無法匯入系統自帶的模組
模組分為3種:
1.自定義模組
2.內建標準模組(又稱標準庫)
3.第三方模組(開源模組)
回到頂部
1.1.1匯入模組
1 #1語法import 2 import module1,module2,module3,module4 3 4 #2from xx import xx 語句 5 from module import name1,name2 67 #這個宣告不會把module模組匯入到當前的名稱空間,只會把name1,name2單個引入到執行的程式 8 9 from module.xx import name as rename 10 #把來自於modname.xx的name的重新改了一個名字,去掉用這個模組的方法 11 12 13 from module import * 14 #這提供了一個簡單的方法來匯入一個模組中的所有專案。這個匯入的模組的方法一般不推薦使用,如果引入的其它來源的命名,很有可能覆蓋已有的定義。
###路徑以當前執行的檔案為準 cat.py from module import cal bin.py from module import cat cat.cal.add() ###定位到m1,注意不是module_t.test() module_t=__import__('m1.t') module_t.t.test() ###直接定位到t import importlib m=importlib.import_module('m1.t') m.test() #對於模組的私有屬性(屬性加_),不能被from m1.t import *匯入,但是可以用from m1.t import test1,_test2
模組的執行本質
#1 import test #2 from modname from test
無論是1,還是2,首先通過sys.pyth找到test.py,然後執行test程式碼(全部執行)
區別是1會將test這個模組名載入到名字空間,而2只會將test這個變數名載入進來。
為模組新增路徑
#模組執行時通過sys.path的路徑一步一步查詢模組的 #匯入模組時是根據那個路徑作為基準來進行的呢?即:sys.path #如果sys.path路勁列表中沒有你想要的路徑,可以通過sys.path.append("路徑")來新增 #當前這是臨時新增,如需永久新增則需修改系統的環境變數 import os,sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)
開源模組安裝的常用方法
1 1.yum 2 2.pip 3 3.apt-get回到頂部
1.1.2__name__
python直譯器把一個特殊變數__name__的值為__main__
#很多模組檔案內容裡面都有 if __name__=='__main__': 執行測試程式碼程式的邏輯 如果我們寫的模組檔案,需要被別人呼叫則不會執行下面的程式的邏輯 我們自已使用用,可以些執行整體程式程式碼的邏輯 自已用的時候 __name__=='__main__' , __name__的變數就等於'__main__',被當作模組匯入到其他的檔案裡時, __name__的變數不等於'__main__'
1.2sys模組
1 sys.argv #在命令列引數是一個空列表,在其他中第一個列表元素中程式本身的路徑 2 sys.exit(n) #退出程式,正常退出時exit(0) 3 sys.version #獲取python解釋程式的版本資訊 4 sys.path #返回模組的搜尋路徑,初始化時使用python PATH環境變數的值 5 sys.platform #返回作業系統平臺的名稱 6 sys.stdin #輸入相關 7 sys.stdout #輸出相關 8 sys.stderror #錯誤相關
1 import sys,time 2 for i in range(1,20): 3 sys.stdout.write("#") #顯示寫入 4 time.sleep(0.2) 5 sys.stdout.flush() # 把每次寫入的東西都給重新整理到螢幕
1 import sys,time 2 3 def view_bar(num, total): 4 rate = float(num) / float(total) 5 rate_num = int(rate * 100) 6 r = '\r%d%%' % (rate_num, ) #%% 表示一個% 7 sys.stdout.write(r) 8 sys.stdout.flush() 9 if __name__ == '__main__': 10 for i in range(0, 101): 11 time.sleep(0.1) 12 view_bar(i, 100)
1.3time模組
在python中,通常3種時間的表示
1.時間戳(timestamp):時間戳表示的是從從1970年1月1日00:00:00開始按秒計算的偏移量。我們執行“type(time.time())”,返回的是float型別。
2.格式化的時間字串 (年-月-日 時:分:秒)
3.元組(struct_time)結構化時間:struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)
常用time模組方法
1 #注:小白多用print(),檢視 2 3 1#time.time() 時間戳 4 print(time.time()) 5 6 2#time.localtime(second) 加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間 7 print(time.localtime()) 8 print(time.localtime(1371643198)) 9 10 3#time.gmtime(second) #utc時區加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間 11 print(time.gmtime()) 12 print(time.gmtime(1391614837)) 13 14 4#mktime ()結構化時間轉換為時間戳 15 print(time.mktime(time.localtime())) 16 17 5#time.ctime(seconds)#將加上時間戳轉換為時間戳的格式化時間,不加則返回當前的的格式化時間 18 print(time.time()) 19 print(time.ctime(1331644244)) 20 21 6#time.asctime(p_tuple)#加引數是加一個結構化時間,把加的結構化時間轉換為格式化時間,不加則返回當前的格式化時間 22 print(time.asctime()) 23 print(time.asctime(time.gmtime())) 24 25 7#time.strftime(format,p_tuple) #把一個結構化時間轉化相應的格式時間 26 print(time.strftime("%Y-%m-%d %X",time.localtime())) 27 28 8#time.strptime(string,format) #把相應的格式時間,轉換為結構化時間 29 print(time.strptime("2015-5-20 20:22:36","%Y-%m-%d %X")) 30 #time.struct_time(tm_year=2015, tm_mon=5, tm_mday=20, tm_hour=20, tm_min=22, tm_sec=36, tm_wday=2, tm_yday=140, tm_isdst=-1) 31 32 9#time.sleep(second)#將程式延遲指定的秒數執行 33 print(time.sleep(5)) 34 35 # 10 time.clock() 36 # 這個需要注意,在不同的系統上含義不同。在UNIX系統上,它返回的是“程序時間”,它是用秒錶示的浮點數(時間戳)。 37 # 而在WINDOWS中,第一次呼叫,返回的是程序執行的實際時間。而第二次之後的呼叫是自第一次呼叫以後到現在的執行 38 # 時間,即兩次時間差。
1.4random模組
1 import random 2 3 print(random.random())#隨機生成一個小於1的浮點數 4 5 print(random.randint(1,3)) #[1-3]隨機生成1到3的數 6 7 print(random.randrange(1,3)) #[1-3)隨機生成1到2的數 8 9 print(random.choice([1,'23',[4,5]]))#隨機在列表中選取一個元素 10 11 print(random.sample([1,'23',[4,5]],2))#隨機在列表中選取2個元素 12 13 print(random.uniform(1,3))#隨機生成1-3的之間的浮點數 14 15 print(random.shuffle([1,3,5,7,9]))#打亂列表中元素的順序
1 import random 2 3 def v_code(): 4 #隨機生成5位數的驗證碼 5 code = '' 6 for i in range(5): 7 num=random.randint(0,9) 8 alf=chr(random.randint(65,90)) 9 add=random.choice([num,alf]) 10 code += str(add) 11 return code 12 print(v_code())
1.5os模組
1 os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑 2 os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd 3 os.curdir 返回當前目錄: ('.') 4 os.pardir 獲取當前目錄的父目錄字串名:('..') 5 os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄 6 os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推 7 os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname 8 os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname 9 os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印 10 os.remove() 刪除一個檔案 11 os.rename("oldname","newname") 重新命名檔案/目錄 12 os.stat('path/filename') 獲取檔案/目錄資訊 13 os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/" 14 os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n" 15 os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為: 16 os.name 輸出字串指示當前使用平臺。win->'nt'; Linux->'posix' 17 os.system("bash command") 執行shell命令,直接顯示 18 os.environ 獲取系統環境變數 19 os.path.abspath(path) 返回path規範化的絕對路徑 20 os.path.split(path) 將path分割成目錄和檔名二元組返回 21 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 22 os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是絕對路徑,返回True 25 os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False 26 os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False 27 os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略 28 print(os.path.join("D:\\python\\wwww","xixi")) #做路徑拼接用的 29 #D:\python\wwww\xixi 30 31 os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間 32 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
1.6json & pickle序列化模組
JSON表示的物件就是標準的JavaScript語言的物件,JSON和Python內建的資料型別對應如下:
json和內建函式的eval()方法,eval將一個字串轉成python物件,不過,eval 方法有侷限性,對於普通的資料型別,json.loads和eval都能用,但遇到特殊型別的時候,eval就不管用了所以eval的重點還是通常用來執行一個字串表示式,並返回表示式的值。
1 import json 2 aa = '{"name":"qa","age":11}' 3 xixi="[1,2,3,4,5,6]" 4 bb = "('1','2')" 5 print(eval(aa)) 6 print(json.loads(aa)) 7 print(type(json.loads(xixi))) 8 print(type(json.loads(aa))) 9 # print(type(json.loads(bb))) #報錯[](){}裡面所有的元素的單引號必須改為雙引號,json不認單引號 10 11 xx = "[xixi,haha]" 12 # print(eval(xx)) #報錯 13 print(json.dumps(xx)) #"[xixi,haha]"
什麼是序列化:
我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化。
反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化。
json:用於字串和python資料型別間進行轉換。
pickle:用於python特有的型別和python的資料型別間進行轉換。
json的dumps,loads的功能:
1 import json 2 data = {'k1':123,'k2':456} 3 s_str=json.dumps(data) #把data物件序列化成字串 >>>>>#序列化的過程 4 # print(s_str) #{"k2": 456, "k1": 123} 5 # print(type(s_str)) str 6 with open("js_new","w") as f: 7 f.write(s_str) #把json的字串寫入到檔案js_new 8 9 #注:用之前先把上面的寫檔案的方式給註釋掉 10 with open("js_new","r") as f: 11 aa = json.loads(f.read()) #把字串重新讀到python原來資料物件 >>>>#反序列化過程 12 print(aa) 13 # print(type(aa)) #<class 'dict'>dumps和loads
json的dump,load的功能
1 import json 2 data = {'k1':123,'k2':456} 3 with open("json_dump","w") as f: 4 json.dump(data,f) 5 #json.dump(x,f) x是python原來資料的物件,f是檔案物件 主要是用來寫python物件到檔案裡面 6 7 with open("json_dump","r") as f: 8 bb = json.load(f) 9 print(bb) 10 print(type(bb)) #<class 'dict'> 11 #json.read(f) #f是檔案物件,把檔案物件的資料讀取成原來python物件的型別dump 和 read
json的dumps,loads,dump,load功能總結
json.dumps(x) 把python的(x)原物件轉換成json字串的物件,主要用來寫入檔案。
json.loads(f) 把json字串(f)物件轉換成python原物件,主要用來讀取檔案和json字串
json.dump(x,f) 把python的(x)原物件,f是檔案物件,寫入到f檔案裡面,主要用來寫入檔案的
json.load(file) 把json字串的檔案物件,轉換成python的原物件,只是讀檔案
pickle的功能
pickle和json的用法類似。
這裡我就不一一舉列了
1 li = "[1,2,3,4,5,6,'aa']" 2 aa = pickle.dumps(li) 3 print(type(aa)) #<class 'bytes'> 4 # print(pickle.dumps(li)) #bytes物件 5 6 with open("pickle_new","wb") as p: #注意w是寫入str,wb時寫入位元組 ,wb寫入檔案是二進位制, 7 # 我們看不到裡面的裡面寫入的檔案內容pickle_new 8 pickle.dump(li,p) 9 with open("pickle_new","rb") as p_b: #以二進位制方式讀取 10 # print(pickle.load(p_b)) #[1,2,3,4,5,6,'aa'] 11 print(pickle.loads(p_b.read())) #[1,2,3,4,5,6,'aa']
注:pickle的問題和所有其他程式語言特有的序列化的問題一樣,就是pickle它只能用於python,並且可能不同版本的python彼此都不相容,因此,只能用pickle儲存那些不重要的資料,不能成功的反序列化也沒關係。
1.1模組
什麼是模組:
在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。
為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,在python中。一個.py檔案就稱為一個模組(Module)
使用模組的好處:
提高了程式碼的可維護性。
其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。我們編寫程式的時候也經常引用其他模組,包括python的內建的模組和第三方模組。
包(package)的概念:
如果不同的人編寫的模組名相同怎麼辦?
為了避免模組名衝突,python有引入了按目錄組織模組的方法,稱為包(Package)
一個abc.py的檔案就是一個名字叫abc的模組。
假設,我們的abc和qaz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突,方法是選擇一個頂層的包名比如MyUser。
引入包以後,只要頂層的包名不與別人 衝突,那所有的模組都不會與別人衝突。現在abc.py模組的名字就變成了MyUser.abc,qaz模組名字就變成了MyUser.qaz.
多級包結構:包.包.模組
注:每個包目錄下面都會有一個——init——.py檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是一個包。——init——.py可以是空檔案,裡面可以有程式程式碼,因為——init——.py就是一個模組,模組名就是MyUser
注:我們自已編寫模組名時,儘量不要與內建函式或則模組名字衝突。如同與系統的模組同名,否則無法匯入系統自帶的模組
模組分為3種:
1.自定義模組
2.內建標準模組(又稱標準庫)
3.第三方模組(開源模組)
回到頂部
1.1.1匯入模組
1 #1語法import 2 import module1,module2,module3,module4 3 4 #2from xx import xx 語句 5 from module import name1,name2 6 7 #這個宣告不會把module模組匯入到當前的名稱空間,只會把name1,name2單個引入到執行的程式 8 9 from module.xx import name as rename 10 #把來自於modname.xx的name的重新改了一個名字,去掉用這個模組的方法 11 12 13 from module import * 14 #這提供了一個簡單的方法來匯入一個模組中的所有專案。這個匯入的模組的方法一般不推薦使用,如果引入的其它來源的命名,很有可能覆蓋已有的定義。
###路徑以當前執行的檔案為準 cat.py from module import cal bin.py from module import cat cat.cal.add() ###定位到m1,注意不是module_t.test() module_t=__import__('m1.t') module_t.t.test() ###直接定位到t import importlib m=importlib.import_module('m1.t') m.test() #對於模組的私有屬性(屬性加_),不能被from m1.t import *匯入,但是可以用from m1.t import test1,_test2
模組的執行本質
#1 import test #2 from modname from test
無論是1,還是2,首先通過sys.pyth找到test.py,然後執行test程式碼(全部執行)
區別是1會將test這個模組名載入到名字空間,而2只會將test這個變數名載入進來。
為模組新增路徑
#模組執行時通過sys.path的路徑一步一步查詢模組的 #匯入模組時是根據那個路徑作為基準來進行的呢?即:sys.path #如果sys.path路勁列表中沒有你想要的路徑,可以通過sys.path.append("路徑")來新增 #當前這是臨時新增,如需永久新增則需修改系統的環境變數 import os,sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)
開源模組安裝的常用方法
1 1.yum 2 2.pip 3 3.apt-get回到頂部
1.1.2__name__
python直譯器把一個特殊變數__name__的值為__main__
#很多模組檔案內容裡面都有 if __name__=='__main__': 執行測試程式碼程式的邏輯 如果我們寫的模組檔案,需要被別人呼叫則不會執行下面的程式的邏輯 我們自已使用用,可以些執行整體程式程式碼的邏輯 自已用的時候 __name__=='__main__' , __name__的變數就等於'__main__',被當作模組匯入到其他的檔案裡時, __name__的變數不等於'__main__'
1.2sys模組
1 sys.argv #在命令列引數是一個空列表,在其他中第一個列表元素中程式本身的路徑 2 sys.exit(n) #退出程式,正常退出時exit(0) 3 sys.version #獲取python解釋程式的版本資訊 4 sys.path #返回模組的搜尋路徑,初始化時使用python PATH環境變數的值 5 sys.platform #返回作業系統平臺的名稱 6 sys.stdin #輸入相關 7 sys.stdout #輸出相關 8 sys.stderror #錯誤相關
1 import sys,time 2 for i in range(1,20): 3 sys.stdout.write("#") #顯示寫入 4 time.sleep(0.2) 5 sys.stdout.flush() # 把每次寫入的東西都給重新整理到螢幕
1 import sys,time 2 3 def view_bar(num, total): 4 rate = float(num) / float(total) 5 rate_num = int(rate * 100) 6 r = '\r%d%%' % (rate_num, ) #%% 表示一個% 7 sys.stdout.write(r) 8 sys.stdout.flush() 9 if __name__ == '__main__': 10 for i in range(0, 101): 11 time.sleep(0.1) 12 view_bar(i, 100)
1.3time模組
在python中,通常3種時間的表示
1.時間戳(timestamp):時間戳表示的是從從1970年1月1日00:00:00開始按秒計算的偏移量。我們執行“type(time.time())”,返回的是float型別。
2.格式化的時間字串 (年-月-日 時:分:秒)
3.元組(struct_time)結構化時間:struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)
常用time模組方法
1 #注:小白多用print(),檢視 2 3 1#time.time() 時間戳 4 print(time.time()) 5 6 2#time.localtime(second) 加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間 7 print(time.localtime()) 8 print(time.localtime(1371643198)) 9 10 3#time.gmtime(second) #utc時區加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間 11 print(time.gmtime()) 12 print(time.gmtime(1391614837)) 13 14 4#mktime ()結構化時間轉換為時間戳 15 print(time.mktime(time.localtime())) 16 17 5#time.ctime(seconds)#將加上時間戳轉換為時間戳的格式化時間,不加則返回當前的的格式化時間 18 print(time.time()) 19 print(time.ctime(1331644244)) 20 21 6#time.asctime(p_tuple)#加引數是加一個結構化時間,把加的結構化時間轉換為格式化時間,不加則返回當前的格式化時間 22 print(time.asctime()) 23 print(time.asctime(time.gmtime())) 24 25 7#time.strftime(format,p_tuple) #把一個結構化時間轉化相應的格式時間 26 print(time.strftime("%Y-%m-%d %X",time.localtime())) 27 28 8#time.strptime(string,format) #把相應的格式時間,轉換為結構化時間 29 print(time.strptime("2015-5-20 20:22:36","%Y-%m-%d %X")) 30 #time.struct_time(tm_year=2015, tm_mon=5, tm_mday=20, tm_hour=20, tm_min=22, tm_sec=36, tm_wday=2, tm_yday=140, tm_isdst=-1) 31 32 9#time.sleep(second)#將程式延遲指定的秒數執行 33 print(time.sleep(5)) 34 35 # 10 time.clock() 36 # 這個需要注意,在不同的系統上含義不同。在UNIX系統上,它返回的是“程序時間”,它是用秒錶示的浮點數(時間戳)。 37 # 而在WINDOWS中,第一次呼叫,返回的是程序執行的實際時間。而第二次之後的呼叫是自第一次呼叫以後到現在的執行 38 # 時間,即兩次時間差。
1.4random模組
1 import random 2 3 print(random.random())#隨機生成一個小於1的浮點數 4 5 print(random.randint(1,3)) #[1-3]隨機生成1到3的數 6 7 print(random.randrange(1,3)) #[1-3)隨機生成1到2的數 8 9 print(random.choice([1,'23',[4,5]]))#隨機在列表中選取一個元素 10 11 print(random.sample([1,'23',[4,5]],2))#隨機在列表中選取2個元素 12 13 print(random.uniform(1,3))#隨機生成1-3的之間的浮點數 14 15 print(random.shuffle([1,3,5,7,9]))#打亂列表中元素的順序
1 import random 2 3 def v_code(): 4 #隨機生成5位數的驗證碼 5 code = '' 6 for i in range(5): 7 num=random.randint(0,9) 8 alf=chr(random.randint(65,90)) 9 add=random.choice([num,alf]) 10 code += str(add) 11 return code 12 print(v_code())
1.5os模組
1 os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑 2 os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd 3 os.curdir 返回當前目錄: ('.') 4 os.pardir 獲取當前目錄的父目錄字串名:('..') 5 os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄 6 os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推 7 os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname 8 os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname 9 os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印 10 os.remove() 刪除一個檔案 11 os.rename("oldname","newname") 重新命名檔案/目錄 12 os.stat('path/filename') 獲取檔案/目錄資訊 13 os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/" 14 os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n" 15 os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為: 16 os.name 輸出字串指示當前使用平臺。win->'nt'; Linux->'posix' 17 os.system("bash command") 執行shell命令,直接顯示 18 os.environ 獲取系統環境變數 19 os.path.abspath(path) 返回path規範化的絕對路徑 20 os.path.split(path) 將path分割成目錄和檔名二元組返回 21 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 22 os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是絕對路徑,返回True 25 os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False 26 os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False 27 os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略 28 print(os.path.join("D:\\python\\wwww","xixi")) #做路徑拼接用的 29 #D:\python\wwww\xixi 30 31 os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間 32 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
1.6json & pickle序列化模組
JSON表示的物件就是標準的JavaScript語言的物件,JSON和Python內建的資料型別對應如下:
json和內建函式的eval()方法,eval將一個字串轉成python物件,不過,eval 方法有侷限性,對於普通的資料型別,json.loads和eval都能用,但遇到特殊型別的時候,eval就不管用了所以eval的重點還是通常用來執行一個字串表示式,並返回表示式的值。
1 import json 2 aa = '{"name":"qa","age":11}' 3 xixi="[1,2,3,4,5,6]" 4 bb = "('1','2')" 5 print(eval(aa)) 6 print(json.loads(aa)) 7 print(type(json.loads(xixi))) 8 print(type(json.loads(aa))) 9 # print(type(json.loads(bb))) #報錯[](){}裡面所有的元素的單引號必須改為雙引號,json不認單引號 10 11 xx = "[xixi,haha]" 12 # print(eval(xx)) #報錯 13 print(json.dumps(xx)) #"[xixi,haha]"
什麼是序列化:
我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化。
反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化。
json:用於字串和python資料型別間進行轉換。
pickle:用於python特有的型別和python的資料型別間進行轉換。
json的dumps,loads的功能:
1 import json 2 data = {'k1':123,'k2':456} 3 s_str=json.dumps(data) #把data物件序列化成字串 >>>>>#序列化的過程 4 # print(s_str) #{"k2": 456, "k1": 123} 5 # print(type(s_str)) str 6 with open("js_new","w") as f: 7 f.write(s_str) #把json的字串寫入到檔案js_new 8 9 #注:用之前先把上面的寫檔案的方式給註釋掉 10 with open("js_new","r") as f: 11 aa = json.loads(f.read()) #把字串重新讀到python原來資料物件 >>>>#反序列化過程 12 print(aa) 13 # print(type(aa)) #<class 'dict'>dumps和loads
json的dump,load的功能
1 import json 2 data = {'k1':123,'k2':456} 3 with open("json_dump","w") as f: 4 json.dump(data,f) 5 #json.dump(x,f) x是python原來資料的物件,f是檔案物件 主要是用來寫python物件到檔案裡面 6 7 with open("json_dump","r") as f: 8 bb = json.load(f) 9 print(bb) 10 print(type(bb)) #<class 'dict'> 11 #json.read(f) #f是檔案物件,把檔案物件的資料讀取成原來python物件的型別dump 和 read
json的dumps,loads,dump,load功能總結
json.dumps(x) 把python的(x)原物件轉換成json字串的物件,主要用來寫入檔案。
json.loads(f) 把json字串(f)物件轉換成python原物件,主要用來讀取檔案和json字串
json.dump(x,f) 把python的(x)原物件,f是檔案物件,寫入到f檔案裡面,主要用來寫入檔案的
json.load(file) 把json字串的檔案物件,轉換成python的原物件,只是讀檔案
pickle的功能
pickle和json的用法類似。
這裡我就不一一舉列了
1 li = "[1,2,3,4,5,6,'aa']" 2 aa = pickle.dumps(li) 3 print(type(aa)) #<class 'bytes'> 4 # print(pickle.dumps(li)) #bytes物件 5 6 with open("pickle_new","wb") as p: #注意w是寫入str,wb時寫入位元組 ,wb寫入檔案是二進位制, 7 # 我們看不到裡面的裡面寫入的檔案內容pickle_new 8 pickle.dump(li,p) 9 with open("pickle_new","rb") as p_b: #以二進位制方式讀取 10 # print(pickle.load(p_b)) #[1,2,3,4,5,6,'aa'] 11 print(pickle.loads(p_b.read())) #[1,2,3,4,5,6,'aa']
注:pickle的問題和所有其他程式語言特有的序列化的問題一樣,就是pickle它只能用於python,並且可能不同版本的python彼此都不相容,因此,只能用pickle儲存那些不重要的資料,不能成功的反序列化也沒關係。