1. 程式人生 > >2018年4月26日筆記

2018年4月26日筆記

關系 run 用法示例 a+b += .get 是否 hashlib 16進制

  • 內置模塊:hashlib

Python的hashlib提供了常見的摘要算法,如md5,sha1, sha224, sha256, sha384, sha512等等,其中md5最為常用。

什麽是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。md5算法得到的就是一個32位的16進制字符串。

一般用法如下:(python3環境中)

 1 import hashlib
 2 
 3 # python3
 4 m1 = hashlib.md5()
 5 m2 = hashlib.md5()
 6 s1 = "abc123
" 7 s2 = bytes(s1.encode("utf8")) # 將s1從string類型轉為bytes類型 8 print(s2) 9 print(type(s2)) 10 11 m1.update(s1.encode("utf8")) 12 print(m1.hexdigest()) 13 m2.update(s2) # 分別對s1和s2進行md5算法,得到的結果相同 14 print(m2.hexdigest())
babc123
<class bytes>
e99a18c428cb38d5f260853678922e03
e99a18c428cb38d5f260853678922e03

python2與python3的區別在於:python2無需指定編碼方式

1 import hashlib
2 
3 # python3
4 print(hashlib.md5("a12".encode("utf8")).hexdigest())
5 
6 # python2
7 print(hashlib.md5("a12").hexdigest())           # python2不同於python3,無需指定編碼方式

註意:如果同一個hash對象重復調用該方法,則m.update(a); m.update(b) 等效於 m.update(a+b)

例如:對字符串"a12"進行md5算法,有以下3種寫法,得到的結果是一樣的

 1 import hashlib
 2 
 3 # 方法一
 4 m3 = hashlib.md5()
 5 m3.update("a12".encode("utf-8"))
 6 print(m3.hexdigest())
 7 
 8 # 方法二
 9 print(hashlib.md5("a12".encode("utf8")).hexdigest())
10 
11 # 方法三
12 m3 = hashlib.md5(b"a")              # 字符串前加b表示為二進制字符串,無需再指定編碼方式
13 m3.update("12".encode("utf8"))
14 print(m3.hexdigest())
15 
16 # 備註:字符串前加u,表示字符串以Unicode格式進行編碼,即unicode字符串
17 # 備註:字符串前加b,表示為二進制字符串
18 # 備註:字符串前加r,聲明該字符串為普通字符串,即不含轉義字符 \n \r 之類的
ed20a959d410ccd843d9e1dfcee04228
ed20a959d410ccd843d9e1dfcee04228
ed20a959d410ccd843d9e1dfcee04228

  • 內置模塊:StringIO , BytesIO

StringIO模塊:主要用於在內存中讀寫字符串數據(string)

BytesIO模塊:實現了在內存中讀寫二進制數據(bytes)

StringIO經常被用來作為字符串的緩存,應為StringIO有個好處,他的有些接口和文件操作是一致的,也就是說用同樣的代碼,可以同時當成文件操作或者StringIO操作。

StringIO類中常用的方法有如下這些:

  1. read
  2. readline
  3. readlines
  4. write
  5. writeline
  6. getvalue
  7. truncate
  8. tell
  9. seek
  10. close
  11. isatty
  12. flush

----------------------

s.read([n])

參數n限定讀取長度,int類型;缺省狀態為從當前讀寫位置讀取對象s中存儲的所有數據。讀取結束後,讀寫位置被移動。

----------------------

s.readline([length])

參數length限定讀取的結束位置,int類型,缺省狀態為None:從當前讀寫位置讀取至下一個以“\n”為結束符的當前行。讀寫位置被移動。

----------------------

s.readlines([sizehint])

參數sizehint為int類型,缺省狀態為讀取所有行並作為列表返回,除此之外從當前讀寫位置讀取至下一個以“\n”為結束符的當前行。讀寫位置被移動。

----------------------

s.write(s)

從讀寫位置將參數s寫入給對象s。參數s為str或unicode類型。讀寫位置被移動。

----------------------

s.writelines(list)

從讀寫位置將list寫入給對象s。參數list為一個列表,列表的成員為str或unicode類型。讀寫位置被移動。

----------------------

s.getvalue()

此函數沒有參數,返回對象s中的所有數據。

----------------------

s.truncate([size])

從讀寫位置起切斷數據,參數size限定裁剪長度,缺省值為None。

----------------------

s.tell()

返回當前讀寫位置。

----------------------

s.seek(pos[,mode])

移動當前讀寫位置至pos處,可選參數mode為0時將讀寫位置移動至pos處,為1時將讀寫位置從當前位置起向後移動pos個長度,為2時將讀寫位置置於末尾處再向後移動pos個長度;默認為0。

----------------------

s.close()

釋放緩沖區,執行此函數後,數據將被釋放,也不可再進行操作。

----------------------

s.isatty()

此函數總是返回0。不論StringIO對象是否已被close()。

----------------------

s.flush()

刷新內部緩沖區。

----------------------

 1 from io import StringIO, BytesIO
 2 
 3 s = StringIO()
 4 s.write("Hello")
 5 s.write("\n")
 6 s.write(r"\n")
 7 s.write("\nworld")
 8 print(s.getvalue())         # 獲取內存中的數據
 9 print(len(s.getvalue()))
10 
11 s.truncate(10)         # 獲取內存中的數據,0表示清空
12 print("截取上文前10個字符為:\n{0}".format(s.getvalue()))
Hello
\n
world
14
截取上文前10個字符為:
Hello
\n
w

Python3 中,內存讀寫字符串數據用StringIO,內存讀寫二進制數據用BytesIO,bytes和str轉換用encode和decode

1 from io import StringIO, BytesIO
2 
3 a = "中文"
4 b = a.encode("utf8")
5 print("{0}\n原始內容的類型為:{1}".format(a, type(a)))
6 print("\n{0}\n編碼後內容的類型為:{1}".format(b, type(b)))
7 
8 c = b.decode("utf8")
9 print("\n{0}\n解碼後內顯示為原始內容,其類型為:{1}".format(c, type(c)))
中文
原始內容的類型為:<class str>

b\xe4\xb8\xad\xe6\x96\x87
編碼後內容的類型為:<class bytes>

中文
解碼後內顯示為原始內容,其類型為:<class str>

  • 內置模塊:json

JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式

json最廣泛的應用是作為AJAX中web服務器和客戶端通訊的數據格式,也常用語http請求中,so it‘s very import to learn JSON

json模塊有 dumps、loads、dump、load四種方法,帶s是處理字符串的,不帶s是處理文件的

loads : str -> PythonObject

dumps : PythonObject -> str

load : file -> PythonObject

dump : PythonObject -> file

Python對象 與 JSON對象 的對應關系:

    +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+

loads()和dumps()用法示例:

 1 import json
 2 
 3 obj = dict({"a":1, "b":2})
 4 
 5 t1 = [{"a":1, "aa":11}, {"b":2}, {"ccc":333}] # json串內部一般用建議用 "雙引號",也能用 ‘單引號‘
 6 t2 = ‘‘‘{"aa":11, "b":2}‘‘‘                     # json串外部不能用 "雙引號"
 7 
 8 t11 = json.loads(t1)            # 將其轉為list
 9 print(t11)
10 print(type(t11))
11 
12 t22 = json.loads(t2)            # 將其轉為dict
13 print(t22)
14 print(type(t22))
15 print("\n")
16 
17 print("*"*20)
18 print("使用dumps() 轉為 str")
19 x = json.dumps(t22)
20 print(type(x))
21 print("再用loads() 轉回原對象obj")
22 print(type(json.loads(x)))
23 
24 # dumps()和str()都將能obj轉為str,但dumps()可逆
25 
26 print("*"*20)
27 print("使用str() 強制轉化為 str")
28 y = str(t22)
29 print(type(y))
30 print("無法使用dict() 強制轉回原對象obj")
31 # print(dict(y))
[{a: 1, aa: 11}, {b: 2}, {ccc: 333}]
<class list>
{aa: 11, b: 2}
<class dict>


********************
使用dumps() 轉為 str
<class str>
再用loads() 轉回原對象obj
<class dict>
********************
使用str() 強制轉化為 str
<class str>
無法使用dict() 強制轉回原對象obj

load()和dump()用法示例:

 1 import json
 2 import codecs
 3 
 4 test = {"a": 1, "b": 2}
 5 with codecs.open("1.txt", "w") as f:
 6     json.dump(test, f)
 7 with codecs.open("1.txt", "r") as f:
 8     obj = json.load(f)
 9     print(obj)
10     print(type(obj))
{a: 1, b: 2}
<class dict>

2018年4月26日筆記