模块制作

  1. “”” “”” / # : 顶格写的注释被称为文档 (__doc__),在模块中的注释与帮助,可以通过 help(model_name) 查看

  2. import model_name / from model_name import function_name

    常用模块

  3. random 随机模块

    1. random.random 随机生成 0~1 间小数
    2. random.randint 随机生成指定范围的整数,包含上下限
    3. random.randrange 随机生成指定 range 范围的整数,不包含上限 randrange(self, start, stop=None, step=1, _int=int)
    4. random.choice 随机获取指定序列的一个元素
    5. random.sample 随机获取指定序列的指定个元素 sample(self, population, k) (k:获取元素数目,population:指定序列(列表))
    6. random.shuffle 随机打乱序列(列表)数据
  4. pip 内置包管理工具

    1. pip install package (-i 国内源地址 换源)
    2. pip uninstall package
    3. pip list 展示
    4. pip update 更新
    5. windows 安装不上部分包
      1. 安装 wheel 包 (先支持安装 .whl 包)
      2. pip install package.whl
    6. linux 压缩包安装
      1. 解压
      2. 找到 setup.py
      3. python setup.py install 安装包
  5. os 路径

    1. os.system("cmd命令") 调用 cmd 并执行命令
    2. os.chdir 修改 python 工作路径 os.chdir("D:\\")
    3. os.mkdir 创建文件夹,在当前路径下
    4. os.walk(pwd) 返回一个生成器(generator),遍历得到内容
      • 每次遍历所得到的返回对象都是一个三元组(path, dirs, files)
        • path : 指的是当前正在遍历的这个文件夹的本身路径地址
        • dirs : 内容是该文件夹中所有的目录的名字 (不包括子目录),有多个以列表返回
        • files : 内容是指该文件夹中所有的文件 (不包括子目录),有多个以列表返回
    5. 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
          8
          import 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)
          """
    6. os.path
      1. os.path.isdir 是否是文件夹
      2. os.path.getsize 获取文件/夹大小
      3. os.path.join('a', 'b') 自动拼接成路径 ==> 'a\\b'
      4. os.path.dirname 返回文件目录,可以嵌套一直向上返回目录
        1
        2
        >>> os.path.dirname(os.path.dirname(os.path.abspath('board')))
        'E:\\python_study\\Django'
      5. os.path.abspath 绝对路径
  6. sys 系统

    1. sys.argv 接收调用python脚本时传递的参数,以列表格式,第一个参数是文件本身相对路径
    2. sys.exit() 涉及到时间以及内存分配方面释放
  7. file :
    open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 读取文件

  8. WordCloud 词云模块

    install wordcloud```
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1. `常用参数`
    + `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)
    `
  9. jieba 中文分词

    install jieba```
    1
    2
    3
    1. `方法`
    + `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`
      
    1
    2
    def lcut(self, *args, **kwargs):
    return list(self.cut(*args, **kwargs))
    + `jieba.lcut_for_search: 返回 list`
    1
    2
    def lcut_for_search(self, *args, **kwargs):
    return list(self.cut_for_search(*args, **kwargs))
  10. turtle 绘图
    turtle: 绘图包
    fillcolor:填充颜色
    begin_fill/end_fill 开始/结束填充

    1. 设置画布大小
      1
      2
      3
      4
      turtle.screensize(canvwidth=None,canvheight=None,bg=None),
      参数分别为画布的宽(单位像素),高,背景颜色。
      如: turtle.screensize(800,600,"green")
      turtle.screensize()#返回默认大小(400,300)
    2. 画笔(画笔的属性,颜色、画线的宽度等)
      • 参数
        • 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): 设置或返回以毫秒为单位的绘图延迟
  11. MyQR 二维码生成器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from 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() # 控制生成位置
    )
  12. JSON

    1. json.dumps() 将 Python 对象编码成 JSON 字符串,将json格式的字符串(str)转换为字典类型(dict)的数据
    2. json.loads() 将已编码的 JSON 字符串解码为 Python 对象,返回来,是将字典类型(dict)的数据转换成json格式的字符串
    3. json.load() 用于读取json格式的文件,将文件中的数据转换为字典类型(dict)
    4. json.dump() 主要用于存入json格式的文件,将字典类型转换为json形式的字符串

      eg:

      1. 将 python 数据结构转换为 JSON
        1
        2
        3
        4
        5
        6
        7
        import json
        data = {
        "name": 'ACME',
        "shares": 100,
        "price": 524.24
        }
        json_str = json.dumps(data)
      2. 将一个 JSON 编码字符串转换回一个 Python 数据结构
        1
        data = json.loads(json_str)
      3. 编码解码 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)
  13. Requests
    import requests

    1. 请求

      1. 请求方式

        • GET

          requests.get(url)

          • 传递 URL 参数
            1
            2
            3
            payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
            r = requests.get("http://httpbin.org/get", params=payload)
            # http://httpbin.org/get?key1=value1&key2=value2&key2=value3
        • POST

          r = requests.post(url, data={"key": "value"}

          • 传递 data 参数
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            payload = {'key1': 'value1', 'key2': 'value2'}
            r = requests.post("http://httpbin.org/post", data=payload)
            print(r.text)
            {
            ...
            "form": {
            "key2": "value2",
            "key1": "value1"
            },
            ...
            }
        • PUT

          r = requests.put(url, data={"key": "value"})

        • DELETE

          r = requests.delete(url)

        • HEAD

          r = requests.head(url)

        • OPTIONS

          r = requests.options(url)

      2. 请求头

        • fake_useragent 模块随机产生请求头
          1
          2
          3
          4
            from fake_useragent import UserAgent
          headers = {"User-Agent": str(UserAgent().random)}
          ```
          + 传递浏览器参数
          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
          4
          5
          6
          7
          8
          3. 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
          3
          import 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'})")
    2. 响应

      • 响应状态码 r.status_code
      • 响应头 r.headers
      1. 二进制响应内容 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))
      2. JSON 响应内容 r.json

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
           import 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'
  1. Socket() 模块

    1
    2
    3
    4
    socket.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: 通常省略,默认为 0

    TCP/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)}

    • 套接字内置方法
      1. 服务器套接字
        • s.bind() 将地址 (主机名,端口号对) 绑定到套接字
        • s.listen() 设置并启动 TCP 监听器
        • s.accept() 被动接受 TCP 客户端连接,一直等待直到连接到达 (阻塞)
      2. 客户端套接字
        • s.connect() 主动发起 TCP 服务器连接
        • s.connect_ex() 类似 connect ,但以错误码形式返回问题,不是抛出异常
      3. 普通套接字方法
        • 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)
      4. 面向阻塞的套接字方法
        • s.setblocking() 设置套接字的阻塞或非阻塞模式
        • s.settimeout() 设置阻塞套接字操作的超时时间
        • s.gettimeout() 或去阻塞套接字操作的超时时间
      5. 面向文件的套接字方法
        • s.fileno() 套接字的文件描述符
        • s.makefile() 创建与套接字关联的文件对象
      6. 数据属性
        • s.family 套接字家族
        • s.type 套接字类型
        • s.proto 套接字协议
  2. glob 模块 (采取类似于“正则”的方式,进行文件匹配)

    模式 意义
    * 匹配所有
    ? 匹配任何单个字符
    [seq] 匹配 seq 中的任何字符
    [!seq] 匹配任何不在 seq 中的字符
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import 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
    """
  3. shutil 模块 (复制、移动文件及文件夹) import shutil

    1. shutil.copy("要复制的文件", "要复制到的位置") 复制文件

    2. shutil.copytree("要复制的文件夹", "要复制到的新文件夹的位置") 复制文件夹,相当于重命名文件夹

      • 将某个文件夹移动到另外一个文件夹(该文件夹必须是新文件夹),不能是已经存在了的文件夹;
    3. shutil.move("要移动的文件/文件夹", "要移动到的位置") 移动文件/文件夹

      • 文件夹或者文件被移动后,原始文件就没有了
    4. shutil.rmtree("要删除的文件夹") 删除文件夹

  1. 创建和解压压缩包 (.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)