2020-07-26
模块制作
“”” “”” / # :
顶格写的注释被称为文档 (__doc__),在模块中的注释与帮助,可以通过 help(model_name) 查看
import model_name / from model_name import function_name
常用模块
random 随机模块
random.random 随机生成 0~1 间小数
random.randint 随机生成指定范围的整数,包含上下限
random.randrange 随机生成指定 range 范围的整数,不包含上限 randrange(self, start, stop=None, step=1, _int=int)
random.choice 随机获取指定序列的一个元素
random.sample 随机获取指定序列的指定个元素 sample(self, population, k) (k:获取元素数目,population:指定序列(列表))
random.shuffle 随机打乱序列(列表)数据
pip 内置包管理工具
pip install package (-i 国内源地址 换源)
pip uninstall package
pip list 展示
pip update 更新
windows 安装不上部分包
安装 wheel 包 (先支持安装 .whl 包)
pip install package.whl
linux 压缩包安装
解压
找到 setup.py
python setup.py install 安装包
os 路径
os.system("cmd命令") 调用 cmd 并执行命令
os.chdir 修改 python 工作路径 os.chdir("D:\\")
os.mkdir 创建文件夹,在当前路径下
os.walk(pwd) 返回一个生成器(generator),遍历得到内容
- 每次遍历所得到的返回对象都是一个三元组(path, dirs, files)
- path : 指的是当前正在遍历的这个文件夹的本身路径地址
- dirs : 内容是该文件夹中所有的目录的名字 (不包括子目录),有多个以列表返回
- files : 内容是指该文件夹中所有的文件 (不包括子目录),有多个以列表返回
- 每次遍历所得到的返回对象都是一个三元组(path, dirs, files)
os.csandir() 返回文件详细信息,需要遍历读取
- 使用 stat() 方法 查看
- st_size : 文件的体积大小 (单位 :bytes /1024 == KB)
- st_atime : 文件的最近访问时间
- st_mtime : 文件的最近修改时间
- st_ctime : Windows 下表示创建时间
- st_birthtime : 只在 Mac、Linux 下可用,表示创建时间
1
2
3
4
5
6
7
8import os
for file in os.scandir("../"):
print(file, file.name, file.stat())
"""
<DirEntry '.git'> .git os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1598876157, st_mtime=1598876157, st_ctime=1570419765)
<DirEntry '.idea'> .idea os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1598876405, st_mtime=1598876368, st_ctime=1598661487)
"""
- 使用 stat() 方法 查看
os.path
os.path.isdir 是否是文件夹
os.path.getsize 获取文件/夹大小
os.path.join('a', 'b') 自动拼接成路径 ==> 'a\\b'
os.path.dirname 返回文件目录,可以嵌套一直向上返回目录
1
2>>> os.path.dirname(os.path.dirname(os.path.abspath('board')))
'E:\\python_study\\Django'os.path.abspath 绝对路径
sys 系统
sys.argv 接收调用python脚本时传递的参数,以列表格式,第一个参数是文件本身相对路径
sys.exit() 涉及到时间以及内存分配方面释放
file :
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 读取文件
WordCloud 词云模块
install wordcloud``` 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
211. `常用参数`
+ `width 词云图片宽度,默认400像素`
+ `height 词云图片高度 默认200像素`
+ `background_color 词云图片的背景颜色,默认为黑色`
+ `font_step 字号增大的步进间隔 默认1号`
+ `font_path 指定字体路径 默认None,对于中文可用font_path='msyh.ttc'`
+ `mini_font_size 最小字号 默认4号`
+ `max_font_size 最大字号 根据高度自动调节`
+ `max_words 最大词数 默认200`
+ `stop_words 不显示的单词 stop_words={"python","java"}`
+ `Scale 默认值1。值越大,图像密度越大越清晰`
+ `prefer_horizontal:默认值0.90,浮点数类型。表示在水平如果不合适,就旋转为垂直方向,水平放置的词数占0.9?`
+ `relative_scaling:默认值0.5,浮点型。设定按词频倒序排列,上一个词相对下一位词的大小倍数。有如下取值:“0”表示大小标准只参考频率排名,“1”如果词频是2倍,大小也是2倍`
+ `mask 指定词云形状图片,默认为矩形`
`通过以下代码读入外部词云形状图片(需要先pip install imageio安装imageio)`
````python
import imageio
from wordcloud import WordCloud
mk = imageio.imread("picture.png")
w = WordCloud(mask=mk)
`jieba 中文分词
install jieba``` 1
2
31. `方法`
+ `jieba.cut: 返回的结构是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)`
+ ```cut(self, sentence, cut_all=False, HMM=True, use_paddle=False)+ `参数` 1. `需要分词的字符串` 2. `cut_all 参数: 用来控制是否采用全模式` 3. `HMM 参数: 用来控制是否使用 HMM 模型` 4. `use_paddle 参数: 用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码` + `jieba.cut_for_search: 返回的结构是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)` + ```cut_for_search(self, sentence, HMM=True)``` + `参数` 1. `需要分词的字符串` 2. `是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细` + `jieba.lcut: 返回list`
+ `jieba.lcut_for_search: 返回 list`1
2def lcut(self, *args, **kwargs):
return list(self.cut(*args, **kwargs))1
2def lcut_for_search(self, *args, **kwargs):
return list(self.cut_for_search(*args, **kwargs))turtle 绘图
turtle: 绘图包
fillcolor:填充颜色
begin_fill/end_fill 开始/结束填充
- 设置画布大小
1
2
3
4turtle.screensize(canvwidth=None,canvheight=None,bg=None),
参数分别为画布的宽(单位像素),高,背景颜色。
如: turtle.screensize(800,600,"green")
turtle.screensize()#返回默认大小(400,300) - 画笔(画笔的属性,颜色、画线的宽度等)
- 参数
turtle.pensize(): 设置画笔的宽度;
turtle.pencolor(): 没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green","red",也可以是RGB3元组。
turtle.speed(speed): 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
turtle.forward(distance): 向当前画笔方向移动distance像素长度
turtle.backward(distance): 向当前画笔相反方向移动distance像素长
度turtle.right(degree): 顺时针移动degree°
turtle.left(degree): 逆时针移动degree°
turtle.pendown(): 移动时绘制图形,缺省时也为绘制
turtle.goto(x,y): 将画笔移动到坐标为x,y的位置
turtle.penup(): 提起笔移动,不绘制图形,用于另起一个地方绘制
turtle.circle(): 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
setx( ): 将当前x轴移动到指定位置
sety( ): 将当前y轴移动到指定位置
setheading(angle): 设置当前朝向为angle角度
home(): 设置当前画笔位置为原点,朝向东。
dot(r): 绘制一个指定直径和颜色的圆点
- 画笔控制命令
turtle.fillcolor(colorstring): 绘制图形的填充颜色
turtle.color(color1, color2): 同时设置pencolor=color1, fillcolor=color2
turtle.filling(): 返回当前是否在填充状态
turtle.begin_fill(): 准备开始填充图形
turtle.end_fill(): 填充完成
turtle.hideturtle(): 隐藏画笔的turtle形状
turtle.showturtle(): 显示画笔的turtle形状
- 全局控制命令
turtle.clear(): 清空turtle窗口,但是turtle的位置和状态不会改变
turtle.reset(): 清空窗口,重置turtle状态为起始状态
turtle.undo(): 撤销上一个turtle动作
turtle.isvisible(): 返回当前turtle是否可见
stamp(): 复制当前图形
turtle.write(s [,font=("font-name",font_size,"font_type")]): 写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项
turtle.delay(delay=None): 设置或返回以毫秒为单位的绘图延迟
- 参数
- 设置画布大小
MyQR 二维码生成器
1
2
3
4
5
6
7
8
9
10
11
12
13from MyQR import myqr
import os
myqr.run(
word = '', # 可以是字符串也可以是网址 (网址前加 http(s)://)
version = 1, # 容错率等级 1 为最高
level = 'H', # 控制纠错水平,范围是 L, M, Q, H,从左向右依次增高
picture = '', # 二维码和图片合成,二维码路径
colorized = 'True', # 是否为彩色二维码
contrast = 1.0, # 调节图片对比度, 1.0 表示原始图片,更小的值表示更低对比度,更大反之,1.0 为默认
brightness = 1.0, # 调节图片亮度,越大越亮,越小越暗
save_name = '', # 生成二维码图片名称,可以是 jpg, png, bmp, gif
save_dir = os.getcwd() # 控制生成位置
)JSON
json.dumps()
将 Python 对象编码成 JSON 字符串,将json格式的字符串(str)转换为字典类型(dict)的数据
json.loads()
将已编码的 JSON 字符串解码为 Python 对象,返回来,是将字典类型(dict)的数据转换成json格式的字符串
json.load()
用于读取json格式的文件,将文件中的数据转换为字典类型(dict)
json.dump()
主要用于存入json格式的文件,将字典类型转换为json形式的字符串
eg:
将 python 数据结构转换为 JSON
1
2
3
4
5
6
7import json
data = {
"name": 'ACME',
"shares": 100,
"price": 524.24
}
json_str = json.dumps(data)将一个 JSON 编码字符串转换回一个 Python 数据结构
1
data = json.loads(json_str)
编码解码 JSON 数据
1
2
3
4
5
6# 写入一个 json 数据
with open("data.json", 'w') as f:
json.dump(data, f)
with open('data.json', 'r') as f:
data = json.load(f)
Requests
import requests
请求
请求方式
GET
requests.get(url)
- 传递 URL 参数
1
2
3payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get("http://httpbin.org/get", params=payload)
# http://httpbin.org/get?key1=value1&key2=value2&key2=value3
- 传递 URL 参数
POST
r = requests.post(url, data={"key": "value"}
- 传递 data 参数
1
2
3
4
5
6
7
8
9
10
11payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
- 传递 data 参数
PUT
r = requests.put(url, data={"key": "value"})
DELETE
r = requests.delete(url)
HEAD
r = requests.head(url)
OPTIONS
r = requests.options(url)
请求头
- fake_useragent 模块随机产生请求头 headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36’}
1
2
3
4from fake_useragent import UserAgent
headers = {"User-Agent": str(UserAgent().random)}
```
+ 传递浏览器参数1
2
3
4
5
6
7
83. Cookie
+ 响应中的 Cookie
```python
import requests
r = requests.get('https://requests.readthedocs.io/zh_CN/latest/user/quickstart.html')
print(r.cookies)
# <RequestsCookieJar[Cookie(version=0, name='__cfduid', value='d22fadb1898ae38e2bc7f811090da41db1595923633',
# port=None, port_specified=False, domain='.readthedocs.io', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1598515633, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None, 'SameSite': 'Lax'}, rfc2109=False)]> - 发送 Cookies
1
2
3import requests
url = 'https://requests.readthedocs.io/zh_CN/latest/user/quickstart.html'
cookies = dict(Cookie="(version=0, name='__cfduid', value='d22fadb1898ae38e2bc7f811090da41db1595923633', port=None, port_specified=False, domain='.readthedocs.io', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1598515633, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None, 'SameSite': 'Lax'})")
- fake_useragent 模块随机产生请求头
响应
响应状态码 r.status_code
响应头 r.headers
二进制响应内容 r.content (对于非文本请求)
Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。
1
2
3
4
5
6# 以请求返回的二进制数据创建一张图片
import requests
from PIL import Image
from io import BytesIO
r = requests.get(url='')
i = Image.open(BytesIO(r.content))JSON 响应内容 r.json
1
2
3
4
5
6
7
8
9
10
11
12import requests
r = requests.get(url='')
r.json()
```
3. 原始响应内容(原始套接字响应) r.raw
```python
import requests
r = requests.get(url='', stream=True)
print(r.raw)
# <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
print(r.raw.read(10))
# '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
Socket() 模块
1
2
3
4socket.socket(socket_family, socket_type, protocol=0)
socket_family: socket.AF_UNIX 或 socket.AF_INET
socket_type: socket.SOCK_STREAM (TCP) 或 socket.SOCK_DGRAM (UDP)
protocol: 通常省略,默认为 0TCP/IP 套接字 tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
UDP/IP 套接字 udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
{如果使用 from socket import * 大大缩短代码 tcpSocket = socket(AF_INET, SOCK_STREAM)}- 套接字内置方法
- 服务器套接字
s.bind()
将地址 (主机名,端口号对) 绑定到套接字s.listen()
设置并启动 TCP 监听器s.accept()
被动接受 TCP 客户端连接,一直等待直到连接到达 (阻塞)
- 客户端套接字
s.connect()
主动发起 TCP 服务器连接s.connect_ex()
类似 connect ,但以错误码形式返回问题,不是抛出异常
- 普通套接字方法
s.recv()
接收 TCP 消息s.recv_into()
接收 TCP 消息到指定缓冲区s.send()
发送 TCP 消息s.sendall()
完整地发送 TCP 消息s.recvfrom()
接收 UDP 消息s.recvfrom_into()
接收 UDP 消息到指定缓冲区s.sendto()
发送 UDP 消息s.getpeername()
连接到套接字 (TCP) 的远程地址s.getsockname()
当前套接字的地址s.getsockopt()
返回给定套接字选项的值s.setsockopt()
设置给定套接字选项的值s.shutdown()
关闭连接s.close()
关闭套接字s.detach()
在未关闭文件描述的情况下关闭套接字,返回文件描述符s.ioctl()
控制套接字的模式 (仅支持 Windows)
- 面向阻塞的套接字方法
s.setblocking()
设置套接字的阻塞或非阻塞模式s.settimeout()
设置阻塞套接字操作的超时时间s.gettimeout()
或去阻塞套接字操作的超时时间
- 面向文件的套接字方法
s.fileno()
套接字的文件描述符s.makefile()
创建与套接字关联的文件对象
- 数据属性
s.family
套接字家族s.type
套接字类型s.proto
套接字协议
- 服务器套接字
- 套接字内置方法
glob 模块 (采取类似于“正则”的方式,进行文件匹配)
模式 意义 * 匹配所有 ? 匹配任何单个字符 [seq] 匹配 seq 中的任何字符 [!seq] 匹配任何不在 seq 中的字符 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import glob
for i in glob.glob("../*.txt"):
print(i)
"""
..\Django_note.txt
..\Email_Token.txt
..\jQuery_note.txt
"""
for i in glob.glob("../*a*.txt"):
print(i)
"""
..\Django_note.txt
..\Email_Token.txt
"""shutil 模块 (复制、移动文件及文件夹)
import shutil
shutil.copy("要复制的文件", "要复制到的位置")
复制文件shutil.copytree("要复制的文件夹", "要复制到的新文件夹的位置")
复制文件夹,相当于重命名文件夹- 将某个文件夹移动到另外一个文件夹(该文件夹必须是新文件夹),不能是已经存在了的文件夹;
shutil.move("要移动的文件/文件夹", "要移动到的位置")
移动文件/文件夹- 文件夹或者文件被移动后,原始文件就没有了
shutil.rmtree("要删除的文件夹")
删除文件夹
- 创建和解压压缩包 (.zip 格式)
import zipfile
1. 读取压缩包内文件 [有时候需要在 filename.encoding("cp437").decode("utf-8")]
1
2
3
4
5
6
7
8
9
10
import zipfile
with zipfile.ZipFile("../ziji.zip", "r") as zipobj:
print(zipobj.namelist())
"""
['1.gif', '__pycache__/', '__pycache__/taichi.cpython-37.pyc', 'build/',]
"""
with zipfile.ZipFile("../ziji.zip", "r") as zipobj:
for filename in zipobj.namelist():
print(filename.encode("gbk").decode("gbk"))
2. 读取压缩包内的文件信息
1
2
3
4
5
6
7
8
9
10
11
import zipfile
with zipfile.ZipFile("../ziji.zip", "r") as zipobj:
for filename in zipobj.namelist():
info = zipobj.getinfo(filename)
new_filename = filename.encode("cp437").decode("utf-8")
print(new_filename, info.file_size/1024/1024, info.compress_size/1024/1024)
"""
1.gif 0.3085899353027344 0.3054962158203125
build/taichi/Analysis-00.toc 0.1259927749633789 0.011130332946777344
"""
3. 解压压缩包
+ `extract("压缩包内要解压的文件名", "要解压到的位置")` : 将压缩包内单个文件解压出来
1
2
3
4
import zipfile
with zipfile.ZipFile("../ziji.zip", "r") as zipobj:
zipobj.extract("1.gif", "./")
+ `extractall("解压到的位置")` : 将压缩包内所有文件解压出来
4. 创建压缩包
+ 对某些文件,创建压缩包
1
2
3
4
5
6
import zipfile
file_list = ["practice_16_20.py", "Practice_21-24.py"]
with zipfile.ZipFile(r".测试用压缩包.zip", "w") as zipobj:
for file in file_list:
zipobj.write(file)
+ 向已存在压缩包内添加文件
1
2
3
4
5
6
import zipfile
file_list = ["test1.txt", "test2.py"]
with zipfile.ZipFile(r".测试用压缩包.zip", "a") as zipobj:
for file in file_list:
zipobj.write(file)