json pickle shelve hashlib collections time
阿新 • • 發佈:2018-08-26
utc時間 進制 摘要算法 nco 獲取 unicode 北京 高效 無序
import json # Json模塊提供了四個功能:dumps、dump、loads、load 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‘}] with open(‘json_file‘,‘w‘,encoding=‘utf-8‘) as f: dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘} json.dump(dic,f,ensure_ascii=False) # dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件with open(‘json_file‘,encoding=‘utf-8‘) as f: dic2 = json.load(f) # load不能load多次 # load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回 # ensure_ascii: 當它為True的時候,所有非ASCII碼字符顯示為\uXXXX序列,只需在dump時將ensure_ascii設置為 # False即可,此時存入json的中文即可正常顯示。 # sort_keys:將數據根據keys的值進行排序。 # 多次dump一次load json的時候,json文件裏面有多個對象,是無法解析的。要不你就自己把這些對象分開,然後再 # json.loads() 要不就存在不同的json文件裏面。 # 示例 # with open(‘data.json‘, ‘w‘) as f: # f.write(json.dumps(d1) + ‘\n‘ + json.dumps(d2)) # 用換行分開 # 讀取時自己分開 # with open(‘data.json‘, ‘r‘) as f: # print(json.loads(f.readline())) import pickle # json,用於字符串 和 python數據類型間進行轉換,json是一種所有的語言都可以識別的數據結構。 # pickle,用於python特有的類型 和 python的數據類型間進行轉換,如果你序列化的內容是列表或者 # 字典,我們非常推薦你使用json模塊 # pickle模塊提供了四個功能:# dumps、loads對內存中的數據進行序列化和反序列化 # dump寫入文件,load從文件讀取 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) with open(‘pickle_file‘,‘wb‘) as f: pickle.dump(struct_time,f) with open(‘pickle_file‘,‘rb‘) as f: struct_time2 = pickle.load(f) # print(struct_time2.tm_year) # 多次dump進一個文件,可使用對應load次數獲取數據 import shelve # 操作和字典類似 # shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。 # shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。 f = shelve.open(‘shelve_file‘) f[‘key‘] = {‘int‘:10, ‘float‘:9.5, ‘string‘:‘Sample data‘} #直接對文件句柄操作,就可以存入數據 existing = f1[‘key‘] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報錯 f.close() f = shelve.open(‘shelve_file‘, flag=‘r‘) # 這個模塊有個限制,它不支持多個應用同一時間往同一個DB進行寫操作。所以當我們知道我們的應用如果只 # 進行讀操作,我們可以讓shelve通過只讀方式打開DB f2 = shelve.open(‘shelve_file‘, writeback=True) # 由於shelve在默認情況下是不會記錄待持久化對象的任何修改的,所以我們在shelve.open()時候需要修改默 # 認參數,否則對象的修改不會保存。 # writeback方式有優點也有缺點。優點是減少了我們出錯的概率,並且讓對象的持久化對用戶更加的透明了; # 但這種方式並不是所有的情況下都需要,首先,使用writeback以後,shelf在open()的時候會增加額外的內 # 存消耗,並且當DB在close()的時候會將緩存中的每一個對象都寫入到DB,這也會帶來額外的等待時間。因為 # shelve沒有辦法知道緩存中哪些對象修改了,哪些對象沒有修改,因此所有的對象都會被寫入。 import hashlib md5 = hashlib.md5() md5.update(‘how to use md5 in python hashlib?‘.encode(‘utf-8‘)) #TypeError: Unicode-objects must be encoded before hashing # print md5.hexdigest() # d26a53750bc40b38b65a520292f69306 # 如果數據量很大,可以分塊多次調用update(),最後計算的結果是一樣的: # md5.update(‘how to use md5‘.encode(‘utf-8‘)) # md5.update(‘ in python hashlib?‘.encode(‘utf-8‘)) # d26a53750bc40b38b65a520292f69306 # MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。 # 另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全類似: # sha1 = hashlib.sha1() # sha1.update(‘how to use sha1 in ‘) # sha1.update(‘python hashlib?‘) # print sha1.hexdigest() hashlib.md5("salt".encode("utf8")) # 經過Salt處理的MD5口令 俗稱“加鹽” # 摘要算法在很多地方都有廣泛的應用。要註意摘要算法不是加密算法,不能用於加密(因為無法通過摘要 # 反推明文),只能用於防篡改,但是它的單向計算特性決定了可以在不存儲明文口令的情況下驗證用戶口令。 import collections # 在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型: # Counter、deque、defaultdict、namedtuple和OrderedDict等。 from collections import namedtuple # Point = namedtuple(‘Point‘, [‘x‘, ‘y‘]) # 一個點的二維坐標就可以表示成: # p = Point(1, 2) # p2 = Point(3, 2) # print(P ,P.x ,P.y) # Point(x=1, y=2) 1 2 # 類似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義:# namedtuple(‘名稱‘, [屬性list]) # Circle = namedtuple(‘Circle‘, [‘x‘, ‘y‘, ‘r‘]) #隊列 # # import queue # FIFO # # q = queue.Queue() # # q.put([1,2,3]) # 一次一個 # # print(q.get()) # 沒有的話會阻塞 # # print(q.qsize()) # 有多少 from collections import deque # q = deque([‘a‘, ‘b‘, ‘c‘]) # q.append(‘x‘) # q.appendleft(‘y‘) # print(q) # deque([‘y‘, ‘a‘, ‘b‘, ‘c‘, ‘x‘]) # deque除了實現list的append()和pop()外,還支持appendleft()和popleft(), # 這樣就可以非常高效地往頭部添加或刪除元素。 # 使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲, # 數據量大的時候,插入和刪除效率很低。 # deque是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧 from collections import OrderedDict # 使用dict時,Key是無序的。在對dict做叠代時,我們無法確定Key的順序。 # 如果要保持Key的順序,可以用OrderedDict: # d = dict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) # od = OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) # print(od) # OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) # OrderedDict的Key是有序的 # 註意,OrderedDict的Key會按照插入的順序排列,不是Key本身排序: # od = OrderedDict() # od[‘z‘] = 1 # od[‘y‘] = 2 # od[‘x‘] = 3 # od.keys() # [‘z‘, ‘y‘, ‘x‘] # 按照插入的Key的順序返回 from collections import defaultdict # 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大於 66 的值保存至字典的第一個key中, # 將小於 66 的值保存至第二個key的值中。即: {‘k1‘: 大於66 , ‘k2‘: 小於66} # values = [11, 22, 33,44,55,66,77,88,99,90] # my_dict = defaultdict(list) # defaultdict(lambda:5) # for value in values: # if value>66:my_dict[‘k1‘].append(value) # else:my_dict[‘k2‘].append(value) # 大概就是設置一個字典的默認value類型,然後直接用key對value這個值或這個類型所擁有的方法屬性進行操作 # dd = defaultdict(lambda: ‘N/A‘) # dd[‘key2‘] # key2不存在,返回默認值‘N/A‘ from collections import Counter # Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲, # 其中元素作為key,其計數作為value。 # c = Counter(‘abcdeabcdabcaba‘) # print c # Counter({‘a‘: 5, ‘b‘: 4, ‘c‘: 3, ‘d‘: 2, ‘e‘: 1}) import time # 常用方法 # 1.time.sleep(2) # 單位為秒。 # 2.time.time() # 獲取當前時間戳 # 在Python中,通常有這三種方式來表示時間:時間戳、元組(struct_time)、格式化的時間字符串 # python中時間日期格式化符號 %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 當前時區的名稱 %% %號本身 # 元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等) 索引(Index) 屬性(Attribute)值(Values) 0 tm_year (年) 比如2011 1 tm_mon (月) 1 - 12 2 tm_mday (日) 1 - 31 3 tm_hour (時) 0 - 23 4 tm_min (分) 0 - 59 5 tm_sec (秒) 0 - 60 6 tm_wday (weekday) 0 - 6(0表示周一) 7 tm_yday (一年中的第幾天) 1 - 366 8 tm_isdst(是否是夏令時) 默認為0 # time.strftime("%Y-%m-%d %X") # 時間字符串 # ‘2017-07-24 13:54:37‘ # 時間元組:localtime將一個時間戳轉換為當前時區的struct_time # time.localtime() # time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,tm_hour=13, tm_min=59, tm_sec=37,tm_wday=0, # tm_yday=205, tm_isdst=0) # 時間戳 # time.time() # 1500875844.800804 # -->結構化時間 # time.gmtime() # 如果不傳參數,直接返回當前時間的struct_time # time.localtime() # time.gmtime(時間戳) # UTC時間,與英國倫敦當地時間一致 # time.localtime(時間戳) # 當地時間,在北京執行這個方法:與UTC時間相差8小時,UTC時間+8小時 = 北京時間 # # time.gmtime(time.time()) # time.localtime(1500000000) # # time.strptime("2017-03-16","%Y-%m-%d") # time.strptime(時間字符串,字符串對應格式) # print(ret) # time.struct_time(tm_year=2018, tm_mon=8, tm_mday=11, tm_hour=14, tm_min=11,tm_sec=52, tm_wday=5, tm_yday=223, tm_isdst=0) # -->時間戳 # time.mktime(結構化時間) # time.mktime(time.localtime(1500000000) # -->字符串時間 # time.strftime("格式定義","結構化時間") # 結構化時間參數若不傳,則顯示當前時間 # time.strftime("%Y-%m-%d",time.localtime(1500000000)) # # time.asctime(結構化時間) # 如果不傳參數,直接返回當前時間的格式化串 # time.asctime(time.localtime(1500000000)) # --> %a %b %d %H:%M:%S %Y串 # ‘Fri Jul 14 10:40:00 2017‘ # # time.ctime(時間戳) # 如果不傳參數,直接返回當前時間的格式化串 # time.ctime(1500000000) # --> %a %b %d %H:%M:%S %Y串 # ‘Mon Jul 24 15:19:07 2017‘
json pickle shelve hashlib collections time