第六章.模块

6.1模块的定义

  • 模块 :

    • 可以吧一个py文件或一个文件夹(包)当作一个模块,以便于以后其他py文件的调用,对程序员直接提供某方面功能的文件.

    • 文件夹 存储了多个py文件的文件夹

    • 如果导入的模块是一个包,这个包里的模块默认不可使用

    • 导入一个包相当于执行 init.py文件中的内容

  • 包的定义(python2与python3的区别七):

    • python2:文件夹中必须有_ _ init _ _.py文件

    • python3:不需要有_ _ init _ _.py文件

    • 建议:推荐以后写代码,无论是python2还是python3,都要加上此文件

6.2模块的分类(类库)

6.2.1 内置模块

6.2.1.1 random

  • 随机数模块:得到一个随机数,起始值和终止值都可取到

    import random    # 导入一个模块 
    v = random.randint(起始,终止)    # 得到一个随机数
    #示例:生成随机验证码
    import random     
    def get_random_code(length=6):
        data = []
        for i in range(length):
            v = random.randint(65,90)
            data.append(chr(v))
        return  ''.join(data)
    ​
    code = get_random_code()
    print(code)
    View Code

6.2.1.2 hashlib

  • 摘要模块 : 将指定字符串进行加密,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法

    import hashlib
    ​
    def get_md5(data):
        obj = hashlib.md5()   #构造哈希对象
        obj.update(data.encode('utf-8'))  #注意转码
        result = obj.hexdigest()
        return result
    ​
    val = get_md5()
    print(val)
    View Code

加盐

import hashlib
​
def get_md5(data):
    obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
​
val = get_md5('123')
print(val)
View Code

应用 : 用户注册加登录

import hashlib
USER_LIST = []
​
def get_md5(data):
    obj = hashlib.md5('qwertyuiopasdfghjklzxcvbnm'.encode('utf-8'))  # 前面的加密随便输入,越长越好
    obj.update(data.encode('utf-8'))
    return result
​
def register():
    print('****************用户注册***************')
    while True:
        user = input('请输入用户名:')
        if user == 'N':
            return
        pwd = input('请输入密码:')
        temp = {'username': user, 'password': get_md5(pwd)}
        USER_LIST.append(temp)
​
def login():
    print('****************用户登录***************')
    user = input('请输入用户名:')
    pwd = input('请输入密码:')
    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(psw):
            return True
​
register()
result = login()
if result:
    print('登陆成功')
else :
    print('登陆失败')
View Code

6.2.1.3 getpass

  • 密码不显示(只能在终端运行)

  • 格式: getpass.getpass

    import getpass
    pwd = getpss.getpass('请输入密码:')
    if pwd == '123':
        print('输入正确')
    View Code

6.2.1.4 time [常用]

  • 时间模块

  • 格式

    1.time.time 时间戳(从1970年1月1日00:00:00到现在经历的秒数)

    #注意
    https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4ZwIFHM6iw==&tip=1&r=-781028520&_=1555559189206

    2.time.sleep(x) x: 等待的秒数

    3.time.timezone

  • 示例:

    import time
    def wrapper(func):    #计算函数执行用时
        def inner():
            start_time = time.time()
            v = func()
            end_time = time.time()
            print(end_time-start_time)
            return v
        return inner
    @wrapper
    def func1():
        time.sleep(2)
        print(123)   
    func1()
    View Code

6.2.1.5 datetime

  • datetime.now() :当前本地时间

  • datetime.utcnow():当前UTC时间

    import time
    from datetime import datetime,timezone,timedelta
    # 获取datetime格式时间
    # 当前本地时间
    v1 = datetime.now() 
    ​
    # 当前东7区时间
    tz = timezone(timedelta(hours=7)) 
    v2 = datetime.now(tz)
    ​
    # 当前UTC时间
    v3 = datetime.utcnow() 
    print(v3)
    #将datetime格式转换为字符串
    import time
    from datetime import datetime,timezone,timedelta
    ​
    v1 = datetime.now()
    v2 = v1.strfttime('%Y-%m-%d %H-%M-%S')
    print(v2)
    ​
    #字符串转成datetime
    v3 = datetime.strptime('2011-11-11','%Y-%m-%d')
    print(v3,type(v3))
    View Code

6.2.1.6sys

1 sys.path

python导入模块时,默认会按照'sys.path'路径依次查找

import sys
print(sys.path)
#['E:\\课后作业及笔记\\课上笔记', 'E:\\homework', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'C:\\PyCharm\\PyCharm 2018.3.5\\PY\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend']
#添加查找路径
import sys                                    
sys.path.append('E:\课后作业及笔记\课上笔记') 
print(sys.path) 
View Code                            

2 sys.argv

sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白。因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。

3.sys.exit(0)

程序终止,0代表正常终止

4 sys.getrefcount

返回对象的引用计数。返回的计数通常比您预期的高一个,因为它包含(临时)引用作为参数getrefcount()。

import sys
a = [11,22,33]
b = a
c = b
print(sys.getrefcount(a))    #4
View Code

4 sys.getrecursionlimit

返回递归限制的当前值,即Python解释器堆栈的最大深度。此限制可防止无限递归导致C堆栈溢出并导致Python崩溃。它可以设置 setrecursionlimit()。python默认支持的递归数量

5 sys.stdout.writre

import os
file_size = os.stat('文件名').st_gize    #1.读取文件大小(字节)
read_size = 0
with open('文件名',mode='rb',encoding='utf-8') as f1,open('a.txt',mode='wb') as f2:        # 2.一点一点的读取文件
    while read_size < file_size:
        chunk = f1.read(1024)           #每次最多读取1024字节
        f2.write(chunk)
        read_size += len(chunk)
        val =int(read_size / file_size *100)   #读取的进度取整
        print('%S%%\r' %val,end='')
View Code

6.2.1.7 os [常用]

1 os.path.exists()

查看文件路径是否存在,如果文件存在,就返回True,如果path不在,返回False

2 os.path.abspath()

获取一个文件的绝对路径

#例子:对于(E:\飞秋\day01)
#01 python fullstack s21day01 计算机基础简介.mp4
import os
v = os.path.abspath('01 python fullstack s21day01 计算机基础简介.mp4')
print(v)  #E:\课后作业及笔记\课上笔记\01 python fullstack s21day01 计算机基础简介.mp4
#会得到想要找的文件的绝对路径
View Code

3 os.path.join()

函数:连接两个或更多的路径名组件

  • 如果各组件名首字母不包含’/’,则函数会自动加上

  • 如果有一个组件是一个绝对路径,则在它之前(包括他自己)的所有组件均会被舍弃

  • 如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾

    import os
    path = os.path.join('b.py','a.py','E:\课后作业及笔记\课上笔记\data.txt',r'E:\课上笔记\c.py',)
    print(path)     #E:\课上笔记\c.py
    import os                                             
    path = os.path.join('b.py','a.py','课上笔记\c.py')       
    print(path)     #b.py\a.py\课上笔记\c.py  
    View Code          

4 os.path.dirname()

  • 返回脚本的上一级路径,即文件路径中所在的目录(不包含文件名)

    import os
    path = os.path.dirname('E:\课后作业及笔记\课上笔记\data.txt')
    print(path)     # E:\课后作业及笔记\课上笔记
    View Code
  • 转义

    v1 = r"D:\code\s21day14\n1.mp4"  (推荐)
    v2 = "D:\\code\\s21day14\\n1.mp4"
    View Code

5 os.listdir()

列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 [第一层]

import os
list1 = os.listdir('E:\飞秋\day01')   
print(list1)
#['01 python fullstack s21day01 计算机基础简介.mp4','02 python fullstack s21day01 Python3 环境安装.mp4', '03 python fullstack s21day01 Python2 环境安装.mp4', '04 python fullstack s21day01 python第一个脚本.mp4', '05 python fullstack s21day01 初识编码.mp4', '06 python fullstack s21day01 上午内容梳理和输入及数据类型.mp4', '07 python fullstack s21day01 变量.mp4', '08 python fullstack s21day01 变量和数据类型练习题.mp4', '09 python fullstack s21day01 输入.mp4', '10 python fullstack s21day01 今日内容总结.mp4', '11 python fullstack s21day01 pycharm安装和使用.mp4', '12 python fullstack s21day01 今日安排.mp4', 'day01 课上所有笔记.md', 'day01 课上所有笔记.pdf']
View Code

6.os.makedir:创建目录,只能生产一层目录(基本不用这个)

7 os.makedirs()

import os
file_path = r'F:\xx\xo\xxxxx.txt'
file_folder = os.path.dirname(file_path)  #获取文件上级目录
if not os.path.exists(file_folder):       
    os.makedirs(file_folder)       #如果上级目录不存在,就创建
    
with open(file_path,mode='w',encoding='utf-8') as f:
    f.write('QWERT')
View Code

8 os.walk()

查看一个目录下所有的文件【所有层】

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。

import os
result = os.walk(r'D:\code\s21day14')
for a,b,c in result:
# a,正在查看的目录 b,此目录下的文件夹 c,此目录下的文件
for item in c:
path = os.path.join(a,item)
print(path)

9.os.rename()

# 将db重命名为sb
import os
os.rename('db','sb')

10 os.stat('文件路径').st_siz

获取文件大小

11

获取文件夹大小

6.2.1.8 json

json是一个特殊的字符串【长得像列表/字典/字典/数字/真假】

格式:

  • 1.必须为 int,str,dict,list,True

  • 2.最外层必须是容器型(列表和字典)

  • 3.内部字符串必须使用双引号

       +-------------------+---------------+
       | Python            | JSON          |
      +===================+===============+
       | dict              | object        |
       +-------------------+---------------+
       | list, tuple       | array         |
       +-------------------+---------------+
       | str               | string        |
       +-------------------+---------------+
       | int, float        | number        |
       +-------------------+---------------+
       | True              | true          |
       +-------------------+---------------+
       | False             | false         |
       +-------------------+---------------+
       | None              | null          |
       +-------------------+---------------+

1.dumps

序列化:将python得值转换为json格式的字符串

import json
v1 = [True,'qwer',11,[22,33],(44,55),{'k1':'v1'}]
v2 = json.dumps(v1)
print(v2)   #[true, "qwer", 11, [22, 33], [44, 55], {"k1": "v1"}]

2 loads

反序列化:将json格式的字符串转换为python的数据类型。

import json                                             
v2 = '[1,true,[22,33],"alex",{"k1":"v1"}]'              
v3 = json.loads(v2)                                    
print(v3)  #[1, True, [22, 33], 'alex', {'k1': 'v1'}]                                              

3 dump

4 load

 

6.2.1.9pickle

  • pickle与json的区别

    • json

      • 优点:所有语言通用

      • 缺点:只能序列化基本的数据类型 list/dict 等

    • pickle

      • 优点:python中所有的东西都能被他序列化(socket对象)

      • 缺点:序列化的内容只有python认识

  1. pickle.dumps:序列化

    • 序列化后的东西不可读

  2. pickle.loads:反序列化

    # 序列化
    v = {1,2,3,4}
    val = pickle.dumps(v)
    print(val)

    # 反序列化
    data = pickle.loads(val)
    print(data,type(data))
  3. pickle.dump:写入文件(注意:mode='wb')

  4. pickle.load:读取文件(注意:mode='rb')

    # 写入文件
    v = {1,2,3,4}
    f = open('x.txt',mode='wb')
    val = pickle.dump(v,f)
    f.close()

    # 读取文件
    f = open('x.txt',mode='rb')
    data = pickle.load(f)
    f.close()
    print(data)
  • 补充知识点:字节类型(bytes)

    v1 = '李杰'
    """
    名称:字符串类型
    内部:unicode
    类型:<class 'str'>
    """
    v2 = v1.encode('utf-8')
    """
    名称:字节类型
    内部:其他编码(utf-8/gbk等)
    类型:<class 'bytes'>
    """
    # 注意:json序列化后是字符串类型,pickle序列化后是字节类型

6.2.1.10 shutil

用途:删除,重命名压缩、解压等

  • 1.shutil.rmtree(path):删除目录

    # 删除目录
    import shutil
    shutil.rmtree(path)
  • 2.shutil.move:重命名

    # 重命名
    import shutil
    shutil.move('test','ttt')
  • 3.shutil.make_archive:压缩文件

    import shutil
    shutil.make_archive('data.txt.zip','zip','E:\课后作业及笔记\课上笔记')
  • 4.shutil.unpack_archive:解压文件

    import shutil
    shutil.unpack_archive('data.zip',extract_dir='E:\课后作业及笔记',format='zip')    #解压到指定文件夹
  • 示例

    import os
    import shutil
    from datetime import datetime
    ctime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    # 1.压缩lizhongwei文件夹 zip
    # 2.放到到 code 目录(默认不存在)
    # 3.将文件解压到D:\x1目录中。
    if not os.path.exists('code'):
       os.makedirs('code')
    shutil.make_archive(os.path.join('code',ctime),'zip','D:\code\s21day16\lizhongwei')

    file_path = os.path.join('code',ctime) + '.zip'
    shutil.unpack_archive(file_path,r'D:\x1','zip')

6.2.1.11copy

  • 拷贝模块

  1. copy.copy:浅拷贝

  2. copy.deepcopy:深拷贝

    import copy 
    v1 = [1,2,3]      
    v2 = copy.copy(v1)             #浅拷贝
    v3 = copy.deepcopy(v1)         #深拷贝

6.2.1.12 importlib

6.2.1.13 collections

  • 用于创建有序字典 OrderedDict

    from collections import OrderedDict

    odic = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    print(odic)
    for k in odic:
       print(k,odic[k])
  • 用于创建可命名元组

    from collections import namedtuple   # 可命名元组
    
    Course = namedtuple('Course',['name','price','teacher'])
    python = Course('python',19800,'alex')
    print(python)          #Course(name='python', price=19800, teacher='alex')
    print(python.name)     #python
    print(python.price)    #19800
    
  • defaultdict

  • deque

6.2.1.13 collections

根据字符串的形式导入模块。

模块 = importlib.import_module('utils.redis')

6.2.2第三方模块

6.2.2.1 基本知识

  • 需要下载安装后才能导入使用

  • 安装方式:

    • pip包管理工具

    # 把pip.exe 所在的目录添加到环境变量中。
    pip install 要安装的模块名称  # pip install xlrd
    • 源码安装

    # 下载源码包(压缩文件) -> 解压 -> 打开cmd窗口,并进入此目录:cd C:\Python37\Lib\site-packages
    # 执行:python3 setup.py build
    # 执行:python3 setup.py install
  • 安装路径:C:\Python36\Lib\site-packages

6.2.2.2 常用的第三方模块

  1. requests

  2. xlrd

6.2.3 自定义模块

  • 自己写的 xx.py

    def f1():
       print('f1')

    def f2():
       print('f2')
  • 在yy.py中调用

    # 调用自定义模块中的功能
    import xx
    xx.f1()
    xx.f2()
  • 运行

    python yy.py 

6.3模块的调用

6.3.1 模块的基本导入及调用

导入XXX.py文件

  • 方式一

# 导入模块,加载此模块中所有的值到内存。
import XXX

# 调用模块中的函数
XXX.func()
  • 方式二

# 导入XXX.py中的func和show
from XXX import func,show

# 导入XXX.py中的所有值
from XXX import *

# 调用模块中的函数
func()
  • 方式三

  •  

# 如果有重名情况,就导入时起一个别名
# 导入XXX.py中的func,并起一个别名为f
from XXX import func as f

# 调用模块中的函数
f()
  • 总结

    • 导入:import 模块,调用:模块.函数()

    • 导入:from 模块 import 函数,调用:函数()

    • 导入:from 模块 import 函数 as 别名,调用:别名()

    • 知识点:

      • as:起别名

      • *:代表全部

6.3.2 导入文件夹中的py文件及调用

导入YYY文件夹中的XXX.py文件

  • 方式一

# 导入模块
import YYY.XXX

# 调用模块中的函数
XXX.func()
  • 方式二

# 导入模块
from YYY import XXX

# 调用模块中的函数
XXX.func()
  • 方式三

# 导入模块
from YYY.XXX import func

# 调用模块中的函数
func()

6.4异常处理

try:
   val = input('请输入数字:')
   num = int(val)
except Exception as e:
   print('操作异常')
   
import requests
try:
ret = requests.get('http://www.google.com')
print(ret.text)
except Exception as e:
print('请求异常')
def func(a):
   try:return a.strip()
   except Exception as e:
       pass
   return False
v = func('alex')
if not v:
   print('函数执行失败')
else:
   print('结果是',v)
posted @ 2019-04-29 17:32  Primrose  阅读(233)  评论(0编辑  收藏  举报