1. 程式人生 > >模組collections,time,random,os,sys,json,pickle

模組collections,time,random,os,sys,json,pickle

# 常用模組一
    # collections模組
    # 時間模組
    # random模組
    # os模組
    # sys模組
    # 序列化模組
    # re模組
# 常用模組二
    # hashlib模組
    # configparse模組
    # logging模組

from collections import namedtuple,deque,OrderedDict,Counter
# 我們知道tuple可以表示不變集合,例如,一個點的二維座標就可以表示成:
Point = namedtuple('point',['x','y'])
p 
= Point(1,2) print(p.x) #1 print(p.y) #2 print(p) #point(x=1, y=2) # 類似的,如果要用座標和半徑表示一個圓,也可以用namedtuple定義: #namedtuple('名稱', [屬性list]): Circle = namedtuple('Circle', ['x', 'y', 'r']) c = Circle(1,1,5) print(c.x) #1 print(c.y) #1 print(c) #Circle(x=1, y=1, r=5) # deque # 使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,
# 因為list是線性儲存,資料量大的時候,插入和刪除效率很低。 # # deque是為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧: q = deque([11,22,33,44]) q.append('aa') #從後面新增 q.appendleft('bb') #從左邊新增 print(q) #deque(['bb', 11, 22, 33, 44, 'aa']) q.pop() #從後面刪除 q.popleft() #從前面刪除 print(q) #deque([11, 22, 33, 44])
# OrderedDict # 使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。 # 如果要保持Key的順序,可以用OrderedDict: d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) #{'a': 1, 'c': 3, 'b': 2} od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) #OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od['a']) #1 # Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似。 c = Counter('abcdeabcdabcaba') print(c) #Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) import time # time.sleep(5) print(time.time()) #時間戳從1970年開始1545099547.6558099 #格式化時間 # %y 兩位數的年份表示(00-99) # %Y 四位數的年份表示(000-9999) # %m 月份(01-12) # %d 月內中的一天(0-31) # %H 24小時制小時數(0-23) # %I 12小時制小時數(01-12) # %M 分鐘數(00=59) # %S 秒(00-59) # %a 本地簡化星期名稱 # %A 本地完整星期名稱 # %b 本地簡化的月份名稱 # %B 本地完整的月份名稱 # %c 本地相應的日期表示和時間表示 # %j 年內的一天(001-366) # %p 本地A.M.或P.M.的等價符 # %U 一年中的星期數(00-53)星期天為星期的開始 # %w 星期(0-6),星期天為星期的開始 # %W 一年中的星期數(00-53)星期一為星期的開始 # %x 本地相應的日期表示 # %X 本地相應的時間表示 # %Z 當前時區的名稱 # %% %號本身 print(time.strftime("%Y-%m-%d %X")) #2018-12-18 10:24:02 print(time.strftime("%Y-%m-%d %H-%M-%S" )) #2018-12-18 10-25-17 print(time.strftime("%Y-%m-%d %H:%M:%S" )) #2018-12-18 10:27:45 print(time.strftime("%Y/%m/%d %H-%M-%S" )) #2018/12/18 10-26-29 print(time.strftime("%Y-%m-%d %H-%M" )) #2018-12-18 10-26 print(time.strftime("%H:%M:%S")) #10:28:38 print(time.ctime()) #Tue Dec 18 10:33:41 2018 # 結構化時間 print(time.localtime()) #time.struct_time(tm_year=2018, tm_mon=12, tm_mday=18, tm_hour=10, tm_min=30, tm_sec=32, tm_wday=1, tm_yday=352, tm_isdst=0) import datetime print(datetime.datetime.now()) #2018-12-18 10:39:02.333192 print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) #2018-12-18 10:44:29 print(datetime.datetime.now().date()) #2018-12-18 print(datetime.date.today()) #2018-12-18 print(datetime.time) import random print(random.random()) # 大於0且小於1之間的小數 # 0.7664338663654585 print(random.uniform(1,3)) #大於1小於3的小數 # 1.6270147180533838 # 隨機整數 print(random.randint(1,5)) # 大於等於1且小於等於5之間的整數 print(random.randrange(1,10,2)) # 大於等於1且小於10之間的奇數 #隨機選擇一個返回 print(random.choice([1,'23',[4,5]])) # #1或者23或者[4,5] #隨機選擇多個返回,返回的個數為函式的第二個引數 print(random.sample([1,'23',[4,5]],2)) # #列表元素任意2個組合 # [[4, 5], '23'] # os模組 import os ''' os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄 os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印 os.remove() 刪除一個檔案 os.rename("oldname","newname") 重新命名檔案/目錄 os.stat('path/filename') 獲取檔案/目錄資訊 os.system("bash command") 執行shell命令,直接顯示 os.popen("bash command).read() 執行shell命令,獲取執行結果 os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑 os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd os.path 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以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對路徑,返回True os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略 os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間 os.path.getsize(path) 返回path的大小 ''' print(os.getcwd()) os.chdir('C:\Program Files') print(os.getcwd()) import sys # sys模組是與python直譯器互動的一個介面 # sys.argv #命令列引數List,第一個元素是程式本身路徑 # sys.exit(0) #退出程式,正常退出時exit(0),錯誤退出sys.exit(1) print(sys.version) #獲取Python解釋程式的版本資訊 print(sys.path) #返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 print(sys.platform) #返回作業系統平臺名稱 # 序列化模組 ''' 將字典轉換成一個字串很簡單,就是str(dic)就可以 但是你要怎麼把一個字串轉換成字典呢? 聰明的你肯定想到了eval(),如果我們將一個字串型別的字典str_dic傳給eval,就會得到一個返回的字典型別了。 eval()函式十分強大,但是eval是做什麼的?e官方demo解釋為:將字串str當成有效的表示式來求值並返回計算結果。 強大的函式有代價。安全性是其最大的缺點。 所以,我們並不推薦用eval方法來進行反序列化操作(將str轉換成python中的資料結構) ''' import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:將一個字典轉換成一個字串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json轉換完的字串型別的字典中的字串是由""表示的 dic2 = json.loads(str_dic) #反序列化:將一個字串格式的字典轉換成一個字典 #注意,要用json的loads功能處理的字串型別的字典中的字串必須由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以處理巢狀的資料型別 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] import json # f = open('json_file','w') # dic = {'k1':'v1','k2':'v2','k3':'v3'} # json.dump(dic,f) #dump方法接收一個檔案控制代碼,直接將字典轉換成json字串寫入檔案 # f.close() # # f = open('json_file') # dic2 = json.load(f) #load方法接收一個檔案控制代碼,直接將檔案中的json字串轉換成資料結構返回 # f.close() # print(type(dic2),dic2) # # json,用於字串和python資料型別間進行轉換 # pickle,用於python特有的型別和python的資料型別間進行轉換 # # pickle模組提供了四個功能:dumps、dump(序列化,存)、loads(反序列化,讀)、load # (不僅可以序列化字典,列表...可以把python中任意的資料型別序列化) import pickle dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = pickle.dumps(dic) print(str_dic) #一串二進位制內容 dic2 = pickle.loads(str_dic) print(dic2) #字典 import time struct_time = time.localtime(1000000000) print(struct_time) f = open('pickle_file','wb') pickle.dump(struct_time,f) f.close() f = open('pickle_file','rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year)