Python學習之經常使用模塊

Python學習目錄html

  1. 在Mac下使用Python3
  2. Python學習之數據類型
  3. Python學習之函數
  4. Python學習之高級特性
  5. Python學習之函數式編程
  6. Python學習之模塊
  7. Python學習之面向對象編程
  8. Python學習之面向對象高級編程
  9. Python學習之錯誤調試和測試
  10. Python學習之IO編程
  11. Python學習之進程和線程
  12. Python學習之正則
  13. Python學習之經常使用模塊
  14. Python學習之網絡編程

Python之因此自稱「batteries included」,就是由於內置了許多很是有用的模塊,無需額外安裝和配置,便可直接使用。python

經常使用模塊

經常使用內建模塊

datetime

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

collections是Python內建的一個集合模塊,提供了許多有用的集合類。算法

namedtuple

>>> 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

deque

使用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

defaultdict

>>> 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是徹底同樣的。

OrderedDict

使用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

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

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

struct模塊來解決bytes和其餘二進制數據類型的轉換,structpack函數把任意數據類型變成bytes

>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'
複製代碼

pack的第一個參數是處理指令,'>I'的意思是:

>表示字節順序是big-endian,也就是網絡序,I表示4字節無符號整數。'

hashlib

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手動安裝。

Pillow

PIL:Python Imaging Library,已是Python平臺事實上的圖像處理標準庫了。PIL功能很是強大,但API卻很是簡單易用。

因爲PIL僅支持到Python 2.7,加上年久失修,因而一羣志願者在PIL的基礎上建立了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了許多新特性,所以,咱們能夠直接安裝使用Pillow。

安裝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')
複製代碼

requests

用於訪問網絡資源。

安裝requests

若是安裝了Anaconda,requests就已經可用了。不然,須要在命令行下經過pip安裝:

$ pip install requests
複製代碼

若是遇到Permission denied安裝失敗,請加上sudo重試。

使用requests

要經過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秒後超時
複製代碼

chardet

用來檢測編碼。

安裝chardet

若是安裝了Anaconda,chardet就已經可用了。不然,須要在命令行下經過pip安裝:

$ pip install chardet
複製代碼

若是遇到Permission denied安裝失敗,請加上sudo重試。

使用chardet

當咱們拿到一個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

psutil = process and system utilities,它不只能夠經過一兩行代碼實現系統監控,還能夠跨平臺使用,支持Linux/UNIX/OSX/Windows等,是系統管理員和運維小夥伴不可或缺的必備模塊。

安裝psutil

若是安裝了Anaconda,psutil就已經可用了。不然,須要在命令行下經過pip安裝:

$ pip install psutil
複製代碼

若是遇到Permission denied安裝失敗,請加上sudo重試。

獲取CPU信息

>>> import psutil
>>> psutil.cpu_count() # CPU邏輯數量
4
>>> psutil.cpu_count(logical=False) # CPU物理核心
2
# 2說明是雙核超線程, 4則是4核非超線程
複製代碼

psutil還能夠獲取用戶信息、Windows服務等不少有用的系統信息,具體請參考psutil的官網:github.com/giampaolo/p…

下一篇:Python學習之網絡編程

相關文章
相關標籤/搜索