上周五下午同事發(fā)我一個Python challenge level 5的鏈接:http://www.pythonchallenge.com/pc/def/peak.html芍锚,看的我是一頭霧水辨宠,找了找網(wǎng)上的各種解答齿梁,還是一臉懵b。
所有的解答里都出現(xiàn)了一個模塊——pickle,所以今天借著這個題學(xué)習(xí)一下這個模塊。
先簡單說下題目:
頁面有一幅圖片,然后圖下面是“pronounce it”嗽上,查看頁面源碼如下:
<html>
<head>
<title>peak hell</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<center>
![](peakhell.jpg)
<br><font color="#c0c0ff">
pronounce it
<br>
<peakhell src="banner.p"/>
</body>
</html>
<!-- peak hell sounds familiar ? -->
注釋里寫道:peak hell sounds familiar ?
其實這個提示就是要用你利用pickle這個模塊,因為這個讀音比較相似(出題人的腦洞也真是夠大)
因為我看答案了熄攘,所以就直接用pickle把banner.p這個文件反序列化了兽愤,看到的結(jié)果是這樣的:
[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 6), ('#', 4), (' ', 3), ('#', 3), (' ', 9), ('#', 3), (' ', 7), ('#', 5), (' ', 3), ('#', 3), (' ', 4), ('#', 5), (' ', 3), ('#', 3), (' ', 10), ('#', 3), (' ', 7), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 3), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 2), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 1), ('#', 7), (' ', 3), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 3), (' ', 2), ('#', 3), (' ', 5), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 5), ('#', 3), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 3), ('#', 4), (' ', 4), ('#', 5), (' ', 4), ('#', 4), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 5), ('#', 3), (' ', 3), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 4), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 2), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 10), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 5), ('#', 2), (' ', 3), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 10), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 14), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 12), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 6), ('#', 2), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 6), ('#', 2), (' ', 3), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 4), ('#', 2), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 11), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 4), ('#', 3), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 5), ('#', 6), (' ', 4), ('#', 5), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 6), (' ', 4), ('#', 11), (' ', 4), ('#', 5), (' ', 6), ('#', 3), (' ', 6), ('#', 6)], [(' ', 95)]]
看完這個就一目了然了,這個結(jié)果是一個list挪圾,里面又包含了多個list浅萧,每個list為每行要打印的內(nèi)容,那么看下最終答案:
import pickle
import urllib.request
banner = urllib.request.urlopen('http://www.pythonchallenge.com/pc/def/banner.p').read()
banner = pickle.loads(banner)
for line in banner:
print(''.join(temp[0]*temp[1] for temp in line))
打印出來是這樣的東東哲思,解題over:
接下來說下pickle這個模塊
什么東西能用pickle模塊存儲?
- 所有Python支持的原生類型: 布爾, 整數(shù), 浮點數(shù), 復(fù)數(shù), 字符串, bytes(字節(jié)串)對象, 字節(jié)數(shù)組, 以及 None
- 由任何原生類型組成的列表洼畅,元組,字典和集合
- 由任何原生類型組成的列表棚赔,元組帝簇,字典和集合組成的列表,元組靠益,字典和集合(可以一直嵌套下去丧肴,直至Python支持的最大遞歸層數(shù))
- 函數(shù),類胧后,和類的實例(帶警告)芋浮。
基本上功能使用和JSON模塊沒有太大區(qū)別,方法也同樣是dumps/dump和loads/load绩卤。
與JSON不同的是pickle不是用于多種語言間的數(shù)據(jù)傳輸途样,它僅作為python對象的持久化或者python程序間進(jìn)行互相傳輸對象的方法,因此它支持了python所有的數(shù)據(jù)類型濒憋。
所以我粗略的認(rèn)為:只要是python定義的東西,應(yīng)該都可以用這個模塊進(jìn)行序列化和反序列化陶夜。
自己寫了個特別簡單的例子加深記憶:
info = [{"name": "Tom", "age": 18}, {"name": "Jerry", "age": 25}]
# 序列化
data1 = pickle.dumps(info)
print(data1)
# 反序列化
data2 = pickle.loads(data1)
print(data2)