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