Python學習目錄html
Python之因此自稱「batteries included」,就是由於內置了許多很是有用的模塊,無需額外安裝和配置,便可直接使用。python
datetime是Python處理日期和時間的標準庫。git
>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期時間建立datetime
>>> dt.timestamp() # 把datetime轉換爲timestamp
1429417200.0
複製代碼
注意Python的timestamp是一個浮點數。若是有小數位,小數位表示毫秒數。github
collections是Python內建的一個集合模塊,提供了許多有用的集合類。算法
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
複製代碼
namedtuple
是一個函數,它用來建立一個自定義的tuple
對象,而且規定了tuple
元素的個數,並能夠用屬性而不是索引來引用tuple
的某個元素。編程
這樣一來,咱們用namedtuple
能夠很方便地定義一種數據類型,它具有tuple的不變性,又能夠根據屬性來引用,使用十分方便。json
使用list
存儲數據時,按索引訪問元素很快,可是插入和刪除元素就很慢了,由於list
是線性存儲,數據量大的時候,插入和刪除效率很低。api
deque是爲了高效實現插入和刪除操做的雙向列表,適合用於隊列和棧:bash
>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])
複製代碼
deque
除了實現list的append()
和pop()
外,還支持appendleft()
和popleft()
,這樣就能夠很是高效地往頭部添加或刪除元素。cookie
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默認值
'N/A'
複製代碼
注意默認值是調用函數返回的,而函數在建立defaultdict
對象時傳入。
除了在Key不存在時返回默認值,defaultdict
的其餘行爲跟dict
是徹底同樣的。
使用dict
時,Key是無序的。在對dict
作迭代時,咱們沒法肯定Key的順序。
若是要保持Key的順序,能夠用OrderedDict
:
>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是無序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
複製代碼
注意,OrderedDict
的Key會按照插入的順序排列,不是Key自己排序:
>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> list(od.keys()) # 按照插入的Key的順序返回
['z', 'y', 'x']
複製代碼
OrderedDict
能夠實現一個FIFO(先進先出)的dict,當容量超出限制時,先刪除最先添加的Key:
from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdatedOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
複製代碼
Counter
是一個簡單的計數器,例如,統計字符出現的個數:
>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
... c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
複製代碼
Counter
實際上也是dict
的一個子類,上面的結果能夠看出,字符'g'
、'm'
、'r'
各出現了兩次,其餘字符各出現了一次。
Base64是一種用64個字符來表示任意二進制數據的方法。
Base64編碼會把3字節的二進制數據編碼爲4字節的文本數據,長度增長33%,好處是編碼後的文本數據能夠在郵件正文、網頁等直接顯示。
若是要編碼的二進制數據不是3的倍數,最後會剩下1個或2個字節怎麼辦?Base64用\x00
字節在末尾補足後,再在編碼的末尾加上1個或2個=
號,表示補了多少字節,解碼的時候,會自動去掉。
>>> import base64
>>> base64.b64encode(b'binary\x00string')
b'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
b'binary\x00string'
複製代碼
struct
模塊來解決bytes
和其餘二進制數據類型的轉換,struct
的pack
函數把任意數據類型變成bytes
:
>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'
複製代碼
pack
的第一個參數是處理指令,'>I'
的意思是:
>
表示字節順序是big-endian,也就是網絡序,I
表示4字節無符號整數。'
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
咱們以常見的摘要算法MD5爲例,計算出一個字符串的MD5值:
import hashlib
md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
複製代碼
計算結果以下:
d26a53750bc40b38b65a520292f69306
複製代碼
還有不少內建模塊也常使用,如:hmac,itertools,contextlib,urllib,XML,HTMLParser
除了內建的模塊外,Python還有大量的第三方模塊。
基本上,全部的第三方模塊都會在PyPI - the Python Package Index上註冊,只要找到對應的模塊名字,便可用pip安裝。
此外,在安裝第三方模塊一節中,咱們強烈推薦安裝Anaconda,安裝後,數十個經常使用的第三方模塊就已經就緒,不用pip手動安裝。
PIL:Python Imaging Library,已是Python平臺事實上的圖像處理標準庫了。PIL功能很是強大,但API卻很是簡單易用。
因爲PIL僅支持到Python 2.7,加上年久失修,因而一羣志願者在PIL的基礎上建立了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了許多新特性,所以,咱們能夠直接安裝使用Pillow。
若是安裝了Anaconda,Pillow就已經可用了。不然,須要在命令行下經過pip安裝:
$ pip install pillow
複製代碼
若是遇到Permission denied
安裝失敗,請加上sudo
重試。
來看看最多見的圖像縮放操做,只需三四行代碼:
from PIL import Image
# 打開一個jpg圖像文件,注意是當前路徑:
im = Image.open('test.jpg')
# 得到圖像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 縮放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把縮放後的圖像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')
複製代碼
其餘功能如切片、旋轉、濾鏡、輸出文字、調色板等包羅萬象。
好比,模糊效果也只需幾行代碼:
from PIL import Image, ImageFilter
# 打開一個jpg圖像文件,注意是當前路徑:
im = Image.open('test.jpg')
# 應用模糊濾鏡:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')
複製代碼
用於訪問網絡資源。
若是安裝了Anaconda,requests就已經可用了。不然,須要在命令行下經過pip安裝:
$ pip install requests
複製代碼
若是遇到Permission denied安裝失敗,請加上sudo重試。
要經過GET訪問一個頁面,只須要幾行代碼:
>>> import requests
>>> r = requests.get('https://www.douban.com/') # 豆瓣首頁
>>> r.status_code
200
>>> r.text
r.text
'<!DOCTYPE HTML>\n<html>\n<head>\n<meta name="description" content="提供圖書、電影、音樂唱片的推薦、評論和...'
複製代碼
對於帶參數的URL,傳入一個dict做爲params
參數:
>>> r = requests.get('https://www.douban.com/search', params={'q': 'python', 'cat': '1001'})
>>> r.url # 實際請求的URL
'https://www.douban.com/search?q=python&cat=1001'
複製代碼
requests自動檢測編碼,可使用encoding
屬性查看:
>>> r.encoding
'utf-8'
複製代碼
不管響應是文本仍是二進制內容,咱們均可以用content
屬性得到bytes
對象:
>>> r.content
b'<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n...'
複製代碼
requests的方便之處還在於,對於特定類型的響應,例如JSON,能夠直接獲取:
>>> r = requests.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json')
>>> r.json()
{'query': {'count': 1, 'created': '2017-11-17T07:14:12Z', ...
複製代碼
須要傳入HTTP Header時,咱們傳入一個dict做爲headers
參數:
>>> r = requests.get('https://www.douban.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
>>> r.text
'<!DOCTYPE html>\n<html>\n<head>\n<meta charset="UTF-8">\n <title>豆瓣(手機版)</title>...'
複製代碼
要發送POST請求,只須要把get()
方法變成post()
,而後傳入data
參數做爲POST請求的數據:
>>> r = requests.post('https://accounts.douban.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})
複製代碼
requests默認使用application/x-www-form-urlencoded
對POST數據編碼。若是要傳遞JSON數據,能夠直接傳入json參數:
params = {'key': 'value'}
r = requests.post(url, json=params) # 內部自動序列化爲JSON
複製代碼
相似的,上傳文件須要更復雜的編碼格式,可是requests把它簡化成files
參數:
>>> upload_files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=upload_files)
複製代碼
在讀取文件時,注意務必使用'rb'
即二進制模式讀取,這樣獲取的bytes
長度纔是文件的長度。
把post()
方法替換爲put()
,delete()
等,就能夠以PUT或DELETE方式請求資源。
除了能輕鬆獲取響應內容外,requests對獲取HTTP響應的其餘信息也很是簡單。例如,獲取響應頭:
>>> r.headers
{Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
>>> r.headers['Content-Type']
'text/html; charset=utf-8'
複製代碼
requests對Cookie作了特殊處理,使得咱們沒必要解析Cookie就能夠輕鬆獲取指定的Cookie:
>>> r.cookies['ts']
'example_cookie_12345'
複製代碼
要在請求中傳入Cookie,只需準備一個dict傳入cookies
參數:
>>> cs = {'token': '12345', 'status': 'working'}
>>> r = requests.get(url, cookies=cs)
複製代碼
最後,要指定超時,傳入以秒爲單位的timeout參數:
>>> r = requests.get(url, timeout=2.5) # 2.5秒後超時
複製代碼
用來檢測編碼。
若是安裝了Anaconda,chardet就已經可用了。不然,須要在命令行下經過pip安裝:
$ pip install chardet
複製代碼
若是遇到Permission denied安裝失敗,請加上sudo重試。
當咱們拿到一個bytes
時,就能夠對其檢測編碼。用chardet檢測編碼,只須要一行代碼:
>>> chardet.detect(b'Hello, world!')
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
複製代碼
檢測出的編碼是ascii
,注意到還有個confidence
字段,表示檢測的機率是1.0(即100%)。
咱們來試試檢測GBK編碼的中文:
>>> data = '離離原上草,一歲一枯榮'.encode('gbk')
>>> chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
複製代碼
檢測的編碼是GB2312
,注意到GBK是GB2312的超集,二者是同一種編碼,檢測正確的機率是74%,language
字段指出的語言是'Chinese'
。
對UTF-8編碼進行檢測:
>>> data = '離離原上草,一歲一枯榮'.encode('utf-8')
>>> chardet.detect(data)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
複製代碼
咱們再試試對日文進行檢測:
>>> data = '最新の主要ニュース'.encode('euc-jp')
>>> chardet.detect(data)
{'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
複製代碼
可見,用chardet檢測編碼,使用簡單。獲取到編碼後,再轉換爲str
,就能夠方便後續處理。
chardet支持檢測的編碼列表請參考官方文檔Supported encodings。
psutil = process and system utilities,它不只能夠經過一兩行代碼實現系統監控,還能夠跨平臺使用,支持Linux/UNIX/OSX/Windows等,是系統管理員和運維小夥伴不可或缺的必備模塊。
若是安裝了Anaconda,psutil就已經可用了。不然,須要在命令行下經過pip安裝:
$ pip install psutil
複製代碼
若是遇到Permission denied安裝失敗,請加上sudo重試。
>>> import psutil
>>> psutil.cpu_count() # CPU邏輯數量
4
>>> psutil.cpu_count(logical=False) # CPU物理核心
2
# 2說明是雙核超線程, 4則是4核非超線程
複製代碼
psutil還能夠獲取用戶信息、Windows服務等不少有用的系統信息,具體請參考psutil的官網:github.com/giampaolo/p…