1. 程式人生 > >Python學習【第9篇】:Python之常用模組二(時間模組,序列化模組等) 常用模組2

Python學習【第9篇】:Python之常用模組二(時間模組,序列化模組等) 常用模組2

常用模組2

一、time模組

表示時間的三種方式:

  時間戳:數字(計算機能認識的)

  時間字串:t='2012-12-12'

  結構化時間:time.struct_time(tm_year=2017, tm_mon=8, tm_mday=8, tm_hour=8, tm_min=4, tm_sec=32, tm_wday=1, tm_yday=220, tm_isdst=0)像這樣的就是結構化時間

複製程式碼
 1 import time
 2 # 物件:物件.方法
 3 # ----------------------------------
 4 # 1.時間戳(數字):給計算機的看的
 5 print(time.time())#當前時間的時間戳
 6 print(time.localtime())#結構化時間物件
 7 s=time.localtime() #當前的結構化時間物件(utc時間)
 8 print(s.tm_year)
 9 s2=time.gmtime()  #這個和localtime只是小時不一樣
10 print(s2)
11 
12 
13 #-----------------------------------
14 # 2.時間的轉換
15 print(time.localtime(15648461))#把時間戳轉換成結構化時間
16 t='2012-12-12' #這是一個字串時間
17 print(time.mktime(time.localtime()))#將結構化時間轉換成時間戳
18 print(time.strftime("%Y-%m-%d",time.localtime()))#將結構化時間轉換成字串時間
19 print(time.strftime('%y/%m/%d  %H:%M:%S'))#小寫的y是取得年的後兩位
20 print(time.strptime('2008-03-12',"%Y-%m-%d"))#將字串時間轉換成結構化時間
複製程式碼 複製程式碼
 1 %y 兩位數的年份表示(00-99)
 2 %Y 四位數的年份表示(000-9999)
 3 %m 月份(01-12)
 4 %d 月內中的一天(0-31)
 5 %H 24小時制小時數(0-23)
 6 %I 12小時制小時數(01-12) 7 %M 分鐘數(00=59) 8 %S 秒(00-59) 9 %a 本地簡化星期名稱 10 %A 本地完整星期名稱 11 %b 本地簡化的月份名稱 12 %B 本地完整的月份名稱 13 %c 本地相應的日期表示和時間表示 14 %j 年內的一天(001-366) 15 %p 本地A.M.或P.M.的等價符 16 %U 一年中的星期數(00-53)星期天為星期的開始 17 %w 星期(0-6),星期天為星期的開始 18 %W 一年中的星期數(00-53)星期一為星期的開始 19 %x 本地相應的日期表示 20 %X 本地相應的時間表示 21 %Z 當前時區的名稱 22 %% %號本身 23 24 python中時間日期格式化符號:
複製程式碼

time.strftime('格式定義',‘結構化時間’)   結構化時間引數若不傳,則顯示當前時間

?
1 2 3 print (time.strptime( '2008-03-12' , "%Y-%m-%d" )) print (time.strftime( '%Y-%m-%d' )) print (time.strftime( "%Y-%m-%d" ,time.localtime( 15444 )))

1 print(time.asctime(time.localtime(150000)))
2 print(time.asctime(time.localtime()))
3 # time.ctime(時間戳)如果不傳引數,直接返回當前時間的格式化字串
4 print(time.ctime())
5 print(time.ctime(150000))

二、random模組

複製程式碼
 1 import random
 2 # ----------------------------
 3 # 1.隨機小數
 4 print(random.random()) #大於0且小於1之間的隨機小數
 5 print(random.uniform(1,3))  #大於1且小於3的隨機小數
 6 
 7 # ----------------------------
 8 # 2.隨機整數
 9 print(random.randint(1,5)) #大於1且小於等於5之間的整數
10 print(random.randrange(1,10,2))  #大於等於1且小於3之間的整數(且是所有的奇數)
11 
12 # ----------------------------
13 # 3.隨機選擇一個返回
14 print(random.choice([1,'23',[4,5]]))
15 # ----------------------------
16 # 4.隨機選擇返回多個
17 print(random.sample([1,'23',[4,5]],2))  #列表元素任意兩個組合
18 # ----------------------------
19 
20 
21 # ----------------------------
22 # 5.打亂列表順序
23 item=[1,5,2,3,4]
24 random.shuffle(item)  #打亂次序
25 print(item)
複製程式碼

 

複製程式碼
 1 # 驗證碼小例子(這個只是產生隨機的四位數字)
 2 # 方法一、
 3 # l=[]
 4 # for i in range(4):
 5 #     l.append(str(random.randint(0,9)))
 6 # print(''.join(l))
 7 # print(l)
 8 
 9 
10 # 方法二
11 # print(random.randint(1000,9999))
12 
13 
14 # 驗證碼升級版
15 # 要求:首次要有數字,其次要有字母,一共四位,可以重複
16 # chr(65-90)#a-z
17 # chr(97-122)#A-Z
18 
19 方法一
20 # num_list = list(range(10))
21 # new_num_l=list(map(str,num_list))#['0','1'...'9']
22 # l=[] #用來存字母
23 # for i in range(65,91):
24 #     zifu=chr(i)
25 #     l.append(zifu)  #['A'-'Z']
26 # new_num_l.extend(l) #要把上面的數字和下面的字母拼在一塊
27 # print(new_num_l)
28 # ret_l=[] #存生成的隨機數字或字母
29 # for i in range(4): #從new_num_l裡面選數字選擇四次就放到了ret_l裡面)
30 #     ret_l.append(random.choice(new_num_l))
31 # # print(ret_l)
32 # print(''.join(ret_l)) #拼成字串
33 
34 方法二
35 # import random
36 # def myrandom():
37 #     new_num_l=list(map(str,range(10)))
38 #     l=[chr(i) for i in range(65,91)]
39 #     new_num_l.extend(l)
40 #     ret_l=[random.choice(new_num_l) for i in range(4)]
41 #     return ''.join(ret_l)
42 # print(myrandom())
43 
44 方法三
45 import random
46 l=list(str(range(10)))+[chr(i) for i in range(65,91)]+[chr(j) for j in range(97,122)]
47 print(''.join(random.sample(l,4)))
複製程式碼

 

三、os模組

複製程式碼
 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.popen("bash command) 執行shell命令,獲取執行結果 19 os.environ 獲取系統環境變數 20 21 22 os.path 23 os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和檔名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。 24  即os.path.split(path)的第二個元素 25 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 26 os.path.isabs(path) 如果path是絕對路徑,返回True 27 os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False 28 os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False 29 os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略 30 os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間 31 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間 32 os.path.getsize(path) 返回path的大小
複製程式碼

注意:os.stat('path\filename') 獲取檔案\目錄資訊的結構說明

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 stat 結構:   st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的裝置。 st_nlink: inode 的連結數。 st_uid: 所有者的使用者 ID st_gid: 所有者的組 ID st_size: 普通檔案以位元組為單位的大小;包含等待某些特殊檔案的資料。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由作業系統報告的 "ctime" 。在某些系統上(如Unix)是最新的元資料更改的時間,<br>在其它系統上(如Windows)是建立時間(詳細資訊參見平臺的文件)。   ststat 結構

四、sys模組

sys模組是與python直譯器互動的一個介面

複製程式碼
 1 import sys
 2 print(sys.argv) #實現從程式外部向程式傳遞引數。(在命令列裡面輸開啟路徑執行)
 3 name=sys.argv[1] #命令列引數List,第一個元素是程式的本身路徑
 4 password = sys.argv[2]
 5 if name=='egon' and password == '123':
 6     print('繼續執行程式')
 7 else:
 8  exit() 9 10 sys.exit()#退出程式,正常退出時exit(0) 11 print(sys.version)#獲取python解釋的版本資訊 12 print(sys.maxsize)#最大能表示的數,與系統多少位有關 13 print(sys.path)#返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 14 print(sys.platform)#返回作業系統平臺名稱
複製程式碼

 

五、序列化模組

1.什麼是序列化-------將原本的字典,列表等內容轉換成一個字串的過程就叫做序列化

2.序列化的目的

  1.以某種儲存形式使自定義物件持久化

  2.將物件從一個地方傳遞到另一個地方

  3.使程式更具維護性

json

  Json模組提供了四個功能:dumps、loads、dump、load

複製程式碼
 1 import json
 2 dic={'k1':'v1','k2':'v2','k3':'v3'}
 3 print(type(dic))
 4 str_dic = json.dumps(dic) #將字典轉換成字串,轉換後的字典中的元素是由雙引號表示的
 5 print(str_dic,type(str_dic))#{"k1": "v1", "k2": "v2", "k3": "v3"} <class 'str'>
 6 
 7 
 8 dic2 = json.loads(str_dic)#將一個字串轉換成字典型別
 9 print(dic2,type(dic2))#{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'>
10 
11 list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
12 str_dic = json.dumps(list_dic) #也可以處理巢狀的資料型別
13 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
14 list_dic2 = json.loads(str_dic)
15 print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
複製程式碼

 

複製程式碼
 1 import json
 2 f=open('json_file','w')
 3 dic = {'k1':'v1','k2':'v2','k3':'v3'}
 4 json.dump(dic,f)# #dump方法接收一個檔案控制代碼,直接將字典轉換成json字串寫入檔案
 5 f.close()
 6 
 7 f = open('json_file')
 8 dic2 = json.load(f)  #load方法接收一個檔案控制代碼,直接將檔案中的json字串轉換成資料結構返回
 9 f.close() 10 print(type(dic2),dic2)
複製程式碼

 

pickle

json 和 pickle 模組

  json:用於字串和python資料型別之間進行轉換

  pickle:用於python特有的型別和python的資料型別進行轉換

複製程式碼
 1 # --------------------------
 2 import pickle
 3 # dic= {'k1':'v1','k2':'v2','k3':'v3'}
 4 # str_dic=pickle.dumps(dic)
 5 # print(str_dic)  #列印的是bytes型別的二進位制內容
 6 #
 7 # dic2 = pickle.loads(str_dic)
 8 # print(dic2)  #有吧字典給轉換回來了
 9 
10 import time
11 struct_time  = time.localtime(1000000000)
12 print(struct_time)
13 f = open('pickle_file','wb')
14 pickle.dump(struct_time,f) 15 f.close() 16 17 f = open('pickle_file','rb') 18 struct_time2 = pickle.load(f) 19 print(struct_time.tm_year)
複製程式碼

 

shelve

shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。
shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。

複製程式碼
 1 import shelve
 2 f = shelve.open('shelve_file')
 3 f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接對檔案控制代碼操作,就可以存入資料
 4 f.close()
 5 
 6 import shelve
 7 f1 = shelve.open('shelve_file')
 8 existing = f1['key']  #取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
 9 f1.close() 10 print(existing) 11 12 shelve
複製程式碼

 這個模組有個限制,它不支援多個應用同一時間往同一個DB進行寫操作。所以當我們知道我們的應用如果只進行讀操作,我們可以讓shelve通過只讀方式開啟DB

1 import shelve
2 f = shelve.open('shelve_file', flag='r')
3 existing = f['key']
4 f.close()
5 print(existing)

由於shelve在預設情況下是不會記錄待持久化物件的任何修改的,所以我們在shelve.open()時候需要修改預設引數,否則物件的修改不會儲存。

複製程式碼
import shelve
f1 = shelve.open('shelve_file')
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close()

f2 = shelve.open('shelve_file', writeback=True)
print(f2['key']) f2['key']['new_value'] = 'this was not here before' f2.close() 設定writeback
複製程式碼

writeback方式有優點也有缺點。優點是減少了我們出錯的概率,並且讓物件的持久化對使用者更加的透明瞭;但這種方式並不是所有的情況下都需要,首先,使用writeback以後,shelf在open()的時候會增加額外的記憶體消耗,並且當DB在close()的時候會將快取中的每一個物件都寫入到DB,這也會帶來額外的等待時間。因為shelve沒有辦法知道快取中哪些物件修改了,哪些物件沒有修改,因此所有的物件都會被寫入。

 

一、time模組

表示時間的三種方式:

  時間戳:數字(計算機能認識的)

  時間字串:t='2012-12-12'

  結構化時間:time.struct_time(tm_year=2017, tm_mon=8, tm_mday=8, tm_hour=8, tm_min=4, tm_sec=32, tm_wday=1, tm_yday=220, tm_isdst=0)像這樣的就是結構化時間

複製程式碼
 1 import time
 2 # 物件:物件.方法
 3 # ----------------------------------
 4 # 1.時間戳(數字):給計算機的看的
 5 print(time.time())#當前時間的時間戳
 6 print(time.localtime())#結構化時間物件
 7 s=time.localtime() #當前的結構化時間物件(utc時間)
 8 print(s.tm_year)
 9 s2=time.gmtime()  #這個和localtime只是小時不一樣
10 print(s2)
11 
12 
13 #-----------------------------------
14 # 2.時間的轉換
15 print(time.localtime(15648461))#把時間戳轉換成結構化時間
16 t='2012-12-12' #這是一個字串時間
17 print(time.mktime(time.localtime()))#將結構化時間轉換成時間戳
18 print(time.strftime("%Y-%m-%d",time.localtime()))#將結構化時間轉換成字串時間
19 print(time.strftime('%y/%m/%d  %H:%M:%S'))#小寫的y是取得年的後兩位
20 print(time.strptime('2008-03-12',"%Y-%m-%d"))#將字串時間轉換成結構化時間
複製程式碼 複製程式碼
 1 %y 兩位數的年份表示(00-99)
 2 %Y 四位數的年份表示(000-9999)
 3 %m 月份(01-12)
 4 %d 月內中的一天(0-31)
 5 %H 24小時制小時數(0-23)
 6 %I 12小時制小時數(01-12) 7 %M 分鐘數(00=59) 8 %S 秒(00-59) 9 %a 本地簡化星期名稱 10 %A 本地完整星期名稱 11 %b 本地簡化的月份名稱 12 %B 本地完整的月份名稱 13 %c 本地相應的日期表示和時間表示 14 %j 年內的一天(001-366) 15 %p 本地A.M.或P.M.的等價符 16 %U 一年中的星期數(00-53)星期天為星期的開始 17 %w 星期(0-6),星期天為星期的開始 18 %W 一年中的星期數(00-53)星期一為星期的開始 19 %x 本地相應的日期表示 20 %X 本地相應的時間表示 21 %Z 當前時區的名稱 22 %% %號本身 23 24 python中時間日期格式化符號:
複製程式碼

time.strftime('格式定義',‘結構化時間’)   結構化時間引數若不傳,則顯示當前時間

?
1 2 3 print (time.strptime( '2008-03-12' , "%Y-%m-%d" )) print (time.strftime( '%Y-%m-%d' )) print (time.strftime( "%Y-%m-%d" ,time.localtime( 15444 )))

1 print(time.asctime(time.localtime(150000)))
2 print(time.asctime(time.localtime()))
3 # time.ctime(時間戳)如果不傳引數,直接返回當前時間的格式化字串
4 print(time.ctime())
5 print(time.ctime(150000))

二、random模組

複製程式碼
 1 import random
 2 # ----------------------------
 3 # 1.隨機小數
 4 print(random.random()) #大於0且小於1之間的隨機小數
 5 print(random.uniform(1,3))  #大於1且小於3的隨機小數
 6 
 7 # ----------------------------
 8 # 2.隨機整數
 9 print(random.randint(1,5)) #大於1且小於等於5之間的整數
10 print(random.randrange(1,10,2))  #大於等於1且小於3之間的整數(且是所有的奇數)
11 
12 # ----------------------------
13 # 3.隨機選擇一個返回
14 print(random.choice([1,'23',[4,5]]))
15 # ----------------------------
16 # 4.隨機選擇返回多個
17 print(random.sample([1,'23',[4,5]],2))  #列表元素任意兩個組合
18 # ----------------------------
19 
20 
21 # ----------------------------
22 # 5.打亂列表順序
23 item=[1,5,2,3,4]
24 random.shuffle(item)  #打亂次序
25 print(item)
複製程式碼

 

複製程式碼
 1 # 驗證碼小例子(這個只是產生隨機的四位數字)
 2 # 方法一、
 3 # l=[]
 4 # for i in range(4):
 5 #     l.append(str(random.randint(0,9)))
 6 # print(''.join(l))
 7 # print(l)
 8 
 9 
10 # 方法二
11 # print(random.randint(1000,9999))
12 
13 
14 # 驗證碼升級版
15 # 要求:首次要有數字,其次要有字母,一共四位,可以重複
16 # chr(65-90)#a-z
17 # chr(97-122)#A-Z
18 
19 方法一
20 # num_list = list(range(10))
21 # new_num_l=list(map(str,num_list))#['0','1'...'9']
22 # l=[] #用來存字母
23 # for i in range(65,91):
24 #     zifu=chr(i)
25 #     l.append(zifu)  #['A'-'Z']
26 # new_num_l.extend(l) #要把上面的數字和下面的字母拼在一塊
27 # print(new_num_l)
28 # ret_l=[] #存生成的隨機數字或字母
29 # for i in range(4): #從new_num_l裡面選數字選擇四次就放到了ret_l裡面)
30 #     ret_l.append(random.choice(new_num_l))
31 # # print(ret_l)
32 # print(''.join(ret_l)) #拼成字串
33 
34 方法二
35 # import random
36 # def myrandom():
37 #     new_num_l=list(map(str,range(10)))
38 #     l=[chr(i) for i in range(65,91)]
39 #     new_num_l.extend(l)
40 #     ret_l=[random.choice(new_num_l) for i in range(4)]
41 #     return ''.join(ret_l)
42 # print(myrandom())
43 
44 方法三
45 import random
46 l=list(str(range(10)))+[chr(i) for i in range(65,91)]+[chr(j) for j in range(97,122)]
47 print(''.join(random.sample(l,4)))
複製程式碼

 

三、os模組

複製程式碼
 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.popen("bash command) 執行shell命令,獲取執行結果 19 os.environ 獲取系統環境變數 20 21 22 os.path 23 os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和檔名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。 24  即os.path.split(path)的第二個元素 25 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 26 os.path.isabs(path) 如果path是絕對路徑,返回True 27 os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False 28 os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False 29 os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略 30 os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間 31 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間 32 os.path.getsize(path) 返回path的大小
複製程式碼

注意:os.stat('path\filename') 獲取檔案\目錄資訊的結構說明

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 stat 結構:   st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的裝置。 st_nlink: inode 的連結數。 st_uid: 所有者的使用者 ID st_gid: 所有者的組 ID st_size: 普通檔案以位元組為單位的大小;包含等待某些特殊檔案的資料。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由作業系統報告的 "ctime" 。在某些系統上(如Unix)是最新的元資料更改的時間,<br>在其它系統上(如Windows)是建立時間(詳細資訊參見平臺的文件)。   ststat 結構

四、sys模組

sys模組是與python直譯器互動的一個介面

複製程式碼
 1 import sys
 2 print(sys.argv) #實現從程式外部向程式傳遞引數。(在命令列裡面輸開啟路徑執行)
 3 name=sys.argv[1] #命令列引數List,第一個元素是程式的本身路徑
 4 password = sys.argv[2]
 5 if name=='egon' and password == '123':
 6     print('繼續執行程式')
 7 else:
 8  exit() 9 10 sys.exit()#退出程式,正常退出時exit(0) 11 print(sys.version)#獲取python解釋的版本資訊 12 print(sys.maxsize)#最大能表示的數,與系統多少位有關 13 print(sys.path)#返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 14 print(sys.platform)#返回作業系統平臺名稱
複製程式碼

 

五、序列化模組

1.什麼是序列化-------將原本的字典,列表等內容轉換成一個字串的過程就叫做序列化

2.序列化的目的

  1.以某種儲存形式使自定義物件持久化

  2.將物件從一個地方傳遞到另一個地方

  3.使程式更具維護性

json

  Json模組提供了四個功能:dumps、loads、dump、load

複製程式碼
 1 import json
 2 dic={'k1':'v1','k2':'v2','k3':'v3'}
 3 print(type(dic))
 4 str_dic = json.dumps(dic) #將字典轉換成字串,轉換後的字典中的元素是由雙引號表示的
 5 print(str_dic,type(str_dic))#{"k1": "v1", "k2": "v2", "k3": "v3"} <class 'str'>
 6 
 7 
 8 dic2 = json.loads(str_dic)#將一個字串轉換成字典型別
 9 print(dic2,type(dic2))#{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'>
10 
11 list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
12 str_dic = json.dumps(list_dic) #也可以處理巢狀的資料型別
13 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
14 list_dic2 = json.loads(str_dic)
15 print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
複製程式碼

 

複製程式碼
 1 import json
 2 f=open('json_file','w')
 3 dic = {'k1':'v1','k2':'v2','k3':'v3'}
 4 json.dump(dic,f)# #dump方法接收一個檔案控制代碼,直接將字典轉換成json字串寫入檔案
 5 f.close()
 6 
 7 f = open('json_file')
 8 dic2 = json.load(f)  #load方法接收一個檔案控制代碼,直接將檔案中的json字串轉換成資料結構返回
 9 f.close() 10 print(type(dic2),dic2)
複製程式碼

 

pickle

json 和 pickle 模組

  json:用於字串和python資料型別之間進行轉換

  pickle:用於python特有的型別和python的資料型別進行轉換

複製程式碼
 1 # --------------------------
 2 import pickle
 3 # dic= {'k1':'v1','k2':'v2','k3':'v3'}
 4 # str_dic=pickle.dumps(dic)
 5 # print(str_dic)  #列印的是bytes型別的二進位制內容
 6 #
 7 # dic2 = pickle.loads(str_dic)
 8 # print(dic2)  #有吧字典給轉換回來了
 9 
10 import time
11 struct_time  = time.localtime(1000000000)
12 print(struct_time)
13 f = open('pickle_file','wb')
14 pickle.dump(struct_time,f) 15 f.close() 16 17 f = open('pickle_file','rb') 18 struct_time2 = pickle.load(f) 19 print(struct_time.tm_year)
複製程式碼

 

shelve

shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。
shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。

複製程式碼
 1 import shelve
 2 f = shelve.open('shelve_file')
 3 f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接對檔案控制代碼操作,就可以存入資料
 4 f.close()
 5 
 6 import shelve
 7 f1 = shelve.open('shelve_file')
 8 existing = f1['key']  #取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
 9 f1.close() 10 print(existing) 11 12 shelve
複製程式碼

 這個模組有個限制,它不支援多個應用同一時間往同一個DB進行寫操作。所以當我們知道我們的應用如果只進行讀操作,我們可以讓shelve通過只讀方式開啟DB

1 import shelve
2 f = shelve.open('shelve_file', flag='r')
3 existing = f['key']
4 f.close()
5 print(existing)

由於shelve在預設情況下是不會記錄待持久化物件的任何修改的,所以我們在shelve.open()時候需要修改預設引數,否則物件的修改不會儲存。

複製程式碼
import shelve
f1 = shelve.open('shelve_file')
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close()

f2 = shelve.open('shelve_file', writeback=True)
print(f2['key']) f2['key']['new_value'] = 'this was not here before' f2.close() 設定writeback
複製程式碼

writeback方式有優點也有缺點。優點是減少了我們出錯的概率,並且讓物件的持久化對使用者更加的透明瞭;但這種方式並不是所有的情況下都需要,首先,使用writeback以後,shelf在open()的時候會增加額外的記憶體消耗,並且當DB在close()的時候會將快取中的每一個物件都寫入到DB,這也會帶來額外的等待時間。因為shelve沒有辦法知道快取中哪些物件修改了,哪些物件沒有修改,因此所有的物件都會被寫入。