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学习之网络编程

相关文章
相关标签/搜索