Python(IO/线程/网络)
2020-01-13 22:59:03 18 举报
AI智能生成
Python快速入门
作者其他创作
大纲/内容
常用第三方模块
Pilow
Python Imaging Library,已经是Python平台事实上的图像处理标准库
requests
它是一个Python第三方库,处理URL资源特别方便。
chardet
编码库,比内置的好用
psutil
process and system utilities,它不仅可以通过一两行代码实现系统监控,
还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,
是系统管理员和运维小伙伴不可或缺的必备模块。
还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,
是系统管理员和运维小伙伴不可或缺的必备模块。
网络编程
用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主
动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,
然后,对每一个新的连接,创建一个线程或进程来处理。
通常,服务器程序会无限运行下去。
动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,
然后,对每一个新的连接,创建一个线程或进程来处理。
通常,服务器程序会无限运行下去。
UDP的使用与TCP类似,但是不需要建立连接。此外,
服务器绑定UDP端口和TCP端口互不冲突,也就是说,
UDP的9999端口与TCP的9999端口可以各自绑定。
服务器绑定UDP端口和TCP端口互不冲突,也就是说,
UDP的9999端口与TCP的9999端口可以各自绑定。
邮件
SMTP
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
POP3
收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。
收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。
Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。
收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。
Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。
访问数据库
安装MySQL驱动
pip install mysql-connector-python
执行INSERT等操作后要调用commit()提交事务;
MySQL的SQL占位符是%s。
MySQL的SQL占位符是%s。
是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等。表和表之间通过外键关联。
要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;
连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。
Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。
要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;
连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。
Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。
补充:魔法函数
__init__():
__str__():
__new__():
__unicode__():
对象上调用unicode()时被调用的。
__call__():
如果一个对象提供了该方法,就可以像函数一样使用它
__len__():
def __len__(self):
return 100
return 100
__repr__():
str() 会返回与repr(),给解释器阅读
__setattr__():
该函数可以设置函数的属性
获取对象属性,只有在属性没有找到的时候调用:__getattr__()
__getattribute__():
__getattr__很像,都是获取属性,但是__getattr__是在属性不存在时被调用,而__getattribute__是无条件被调用
__delattr__():
实现了该函数的类可以用del 命令来删除属性
__setitem__():
该函数可以给对象赋值,我们可以以下标的方式对其进行操作
__getitem__():
与上函数相反,__getitem__可以使对象支持已下标的方式获取值
__delitem__():
该函数支持以下标方式删除对象数据,
实现了这三个函数,这个类就像字典一样,具备了基本的增删查功能
实现了这三个函数,这个类就像字典一样,具备了基本的增删查功能
__iter__():
只要定义了__iter__()方法对象,就可以使用迭代器访问
__del__():
这可以说是一个析构器,或者回收器,在对象引用数降到0时执行
常用内建模块
datetime
from datetime import datetime
获取当前:now =datetime.now()
获取指定日期和时间
datatime和timestamp转换
str和datetime转换
datetime加减
本地时间转换UTC时间
时区转换
datetime表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。
如果要存储datetime,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
如果要存储datetime,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
collections
namedtuple:储存坐标
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p=Point(1,2)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p=Point(1,2)
deque是为了高效实现插入和删除操作的双向列表
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
defaultdict希望key不存在时,返回一个默认值
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
ChainMap默认参数
from collections import ChainMap
from collections import ChainMap
Counter是一个简单的计数器
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
collections模块提供了一些有用的集合类,可以根据需要选用。
base64
import base64
b1=base64.b64encode(b'binary\x00string')
struct
struct模块来解决bytes和其他二进制数据类型的转换。
import struct
struct.pack('>I', 10240099)
struct.unpack('<ccIIIIIIHH', s)
struct.pack('>I', 10240099)
struct.unpack('<ccIIIIIIHH', s)
hashlib
import hashlib
md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
hmac
itertools
itertools提供了非常有用的用于操作迭代对象的函数。
contextlib
urllib
from urllib import request
with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
req = request.Request('https://passport.weibo.cn/sso/login')
with request.urlopen(url,data) as f:
with request.urlopen(url,data) as f:
Handler
如果还需要更复杂的控制,比如通过一个Proxy去访问网站,我们需要利用ProxyHandler来处理
如果还需要更复杂的控制,比如通过一个Proxy去访问网站,我们需要利用ProxyHandler来处理
urllib提供的功能就是利用程序去执行各种HTTP请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的。
XML
HTML Parser
HTML本质上是XML的子集,但是HTML的语法没有XML那么严格,所以不能用标准的DOM或SAX来解析HTML。
利用HTMLParser,可以把网页中的文本、图像等解析出来。
IO
文件读写
f = open('/Users/michael/test.txt', 'r')
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
f.write('Hello, world!')
异常操作
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
with open('/path/to/file', 'r') as f:
for line in f.readlines():
file-like Object
除了file外,还可以是内存的字节流,网络流,自定义流等等
StringIO就是在内存中创建的file-like Object,常用作临时缓冲。
StringIO/BytesIO
很多时候,数据读写不一定是文件,也可以在内存中读写。
from io import BytesIO
BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
>>> f.write('中文'.encode('utf-8'))
from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
>>> print(f.getvalue())
>>> f.write('hello')
>>> print(f.getvalue())
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
操作文件和目录(os模块)
import os
os.uname()
os.environ
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
('/Users/michael/testdir', 'file.txt')
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
('/path/to/file', '.txt')
# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')
Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。
序列化(pickle/JSON)
>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
>>> pickle.dump(d, f)
>>> f.close()
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d = pickle.load(f)
>>> f.close()
JSON
import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
json.loads(json_str)
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
json.loads(json_str)
类序列化需要方法。考虑用装饰者
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
return {
'name': std.name,
'age': std.age,
'score': std.score
}
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
return Student(d['name'], d['age'], d['score'])
json.dumps(s, default=student2dict)
json.loads(json_str, object_hook=dict2student)
进程线程
异步Async
注意到consumer函数是一个generator,把一个consumer传入produce后:
- 首先调用c.send(None)启动生成器;
- 然后,一旦生产了东西,通过c.send(n)切换到consumer执行;
- consumer通过yield拿到消息,处理,又通过yield把结果传回;
- produce拿到consumer处理的结果,继续生产下一条消息;
- produce决定不生产了,通过c.close()关闭consumer,整个过程结束。
asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,
然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
asyncio提供了完善的异步IO支持;
异步操作需要在coroutine中通过yield from完成;
多个coroutine可以封装成一组Task然后并发执行。
异步操作需要在coroutine中通过yield from完成;
多个coroutine可以封装成一组Task然后并发执行。
async/await
Python从3.5版本开始为asyncio提供了async和await的新语法;
注意新语法只能用在Python 3.5以及后续版本,如果使用3.4版本,则仍需使用上一节的方案。
注意新语法只能用在Python 3.5以及后续版本,如果使用3.4版本,则仍需使用上一节的方案。
aiohttp
asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。
如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。
asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。
如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。
asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。
aiohttp的初始化函数init()也是一个coroutine,loop.create_server()则利用asyncio创建TCP服务。
正则
要做更精确地匹配,可以用[]表示范围,比如:
- [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;
- [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;
- [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
- [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
- A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。
- ^表示行的开头,^\d表示必须以数字开头。
- $表示行的结束,\d$表示必须以数字结束。
re模块
切分字符串
分组
贪婪匹配
编译
web开发
无论多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。
复杂的Web应用程序,光靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上再抽象出Web框架,进一步简化Web开发。
复杂的Web应用程序,光靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上再抽象出Web框架,进一步简化Web开发。
Python Web Server Gateway Interface
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>']
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>']
框架
- Django:全能型Web框架;
- web.py:一个小巧的Web框架;
- Bottle:和Flask类似的Web框架;
- Tornado:Facebook的开源异步Web框架。
模板
jinja2
基础部分
子主题
0 条评论
下一页