Python是个啥-第六章 模块

第六章 模块

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

模块让你能够有逻辑地组织你的 Python 代码段。把相关的代码分配到一个模块里能让你的代码更好用,更易懂。模块能定义函数,类和变量,模块里也能包含可执行的代码。

模块分类:内置模块、第三方模块、自定义模块。

6.1 内置模块

  • os

  • sys

  • shutil

  • hashlib

  • getpass

  • random

  • time

  • datetime

  • json

  • pickle

  • pickle

  • logging

6.1.1 os模块

  • os.path.join() #文件拼接
  • os.path.dirname() #获取文件的上级目录(路径最好转义,前面加r,例如:r"/home/gnome/abc.mp4")。
  • os.path.abspath() #获取文件的绝对路径。
  • os.path.exists() #判断路径是否存在,True,False。
  • os.path.basename() #返回path中的文件名。
  • os.path.getmtime(path) #文件或文件夹的最后修改时间,从新纪元到访问时的秒数。
  • os.path.getatime(path) #文件或文件夹的最后访问时间,从新纪元到访问时的秒数。
  • os.path.getctime(path) #文件或文件夹的创建时间,从新纪元到访问时的秒数。
  • os.stat() #获取文件大小byte。
  • os.listdir() #目录列表类似ls/dir功能,把所有的文件存在列表中.(结果需要用for才能看到结果)。
  • os.walk() #目录下面的所有文件,包含所有层.(结果需要用for才能看到结果)。
  • os.mkdir() #创建单层目录。
  • os.makedirs() #创建单层或者多层目录(创建目录之前先检查路径是否存在如果存)。
  • os.rename() #重命名。
import os
# 和操作系统相关的数据
os.path.exists() #判断路径是否存在,True,False.
os.path.abspath() #获取文件的绝对路径.
os.path.dirname() #获取文件的上级目录(路径最好转义,前面加r,例如:r"/home/gnome/abc.mp4")
os.stat().st_size #获取文件大小byte.

print(os.path.abspath("百家姓.log"))
print(os.path.dirname(r"D:\pyproject\百家姓.log"))

os.path.join() #文件拼接
path='/home/gnome'
file_path='a.txt'
full_path=os.path.join(path,file_path)
print(full_path) #/home/gnome/a.txt

os.listdir() #目录列表类似ls/dir功能,把所有的文件存在列表中.(结果需要用for才能看到结果)
os.walk()  #目录下面的所有文件,包含所有层.(结果需要用for才能看到结果)

6.1.2 sys模块

sys is system, python解释器相关的数据。

  • sys.getrefcount #获得一个值的应用计数
  • sys.getrecursionlimit() #python默认支持的递归数
  • sys.argv #获取执行脚本时,传入的参数[脚本文件路径,传入的第一个参数,传入的第二个参数]
  • sys.path #获取系统中path的所有路径并保存在list里面
  • sys.stdout.write #-->print ,其功能和\r相同
  • sys.exit() #程序终止 exit(0) #无错误退出 ;exit(1) #有错误退出
  • \r
import sys
sys.getrefcount #获得一个值的应用计数
sys.getrecursionlimit() #python默认支持的递归数
a=[1,22,3,32,2]
b=a
print(sys.getrefcount(a))   #函数被引用的计数,引用计数器(此例引用了3次,函数内部引用了两次,b赋值引用1次)

sys.argv #获取执行脚本时,传入的参数[脚本文件路径,传入的第一个参数,传入的第二个参数]
sys.argv[1]  #就是用户传入的第一个参数

sys.path #系统路径
sys.stdout.write #-->print (进度)
sys.stdout.write('你好')  #输出

6.1.3 shutil模块

shutil高级的文件、文件夹、压缩包 处理模块.

  • shutil.rmtree() #删除目录
  • shutil.move() #重命名
  • shutil.make_archive() #压缩
  • shutil.unpack_archive() #解压缩
file_path=r'zipdir\x.txt'

#删除和重命名
import shutil

#删除目录及文件.
shutil.rmtree('zipdir.tar.tar')

#重命名
shutil.move('1.txt','file1.txt')

#压缩文件 压缩后的文件名,压缩格式,被压缩文件目录
# shutil.make_archive('base_name','format','dirname')
shutil.make_archive('zipdir.tar','tar','zipdir')

#解压
# shutil.unpack_archive('filename',format='',extract_dir='')
shutil.unpack_archive('zipdir.tar.tar',format='tar',extract_dir='logs')

6.1.4 hashlib模块

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。

hashlib的功能MD5将指定的字符串进行加密,加密前需要将字符串转换为2进制,再讲加密后的内容转换为十进制显示.

  • MD5格式
import hashlib
obj=hashlib.md5()
obj.update('date'.encode('utf-8')) #uncode转成压缩后的二进制
result=obj.hexdigest() #转成十进制
print(result)
  • 加盐

    为了增加难度,给原有密文进行固定字符串的加强,加盐后,字符串会和需要加密的内容一起进行md5计算,加盐的字符串越长月负责,黑客在用字典对比密码的时候花费的时间就越长。

obj=hashlib.md5('fueufu193'.encode('utf-8'))  #加盐'fueufu193'
  • md5应用

    将md5加密写成一个函数共以后调用

def get_md5(data):
    #md5加密
    obj=hashlib.md5('fueufu193'.encode('utf-8'))  #加盐'fueufu193'
    obj.update(data.encode('utf-8')) #uncode转成压缩后的二进制
    result=obj.hexdigest() #转成十进制
    return result
print(get_md5('123.com'))

6.1.5 getpass模块

  • getpass格式

    getpass主要应用在用户输入密码时隐藏输入内容。

import getpass
pwd=getpass.getpass('请输入密码:')
print (pwd)

6.1.6 random模块

random() 方法返回随机生成的一个实数,它在(0,1)范围内。random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。

  • random格式
import random
random.random() #产生0 到 1 之间的随机浮点数
# 0.4235090935967636
  • random常用方法
print( random.randint(1,10) )        # 产生 1 到 10 的一个整数型随机数
print( random.random() )             # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) )     # 产生  1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') )   # 从序列中随机选取一个元素
print( random.randrange(1,10,2) )   # 生成从1到10的间隔为2的随机整数

# 多个字符中选取指定数量的字符组成新字符串:
print( ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q'], 5)))

a=[1,3,5,6,7]   # 将列表a中的元素顺序打乱
random.shuffle(a)
print(a)

6.1.7 time模块

  • time模块格式
  • time.sleep() #延迟执行单位秒
  • time.time() #返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
  • time.timezone #获取当前时区和格林威治(0时区)时区的间隔时间(单位是秒),向东是负数,向西是正数
  • time.strftime() #方法语法
import time
v1=time.time()
print(v1)
# 1564388944.3761902
v2=time.timezone
print(v2)
# -28800
v3=time.ctime()
print(v3)
# Mon Jul 29 16:31:27 2019
v4=time.altzone
print(v4)
# -32400
v=time.strptime('2011-11-12','%Y-%m-%d')
print(v)
# time.struct_time(tm_year=2011, tm_mon=11, tm_mday=12, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=316, tm_isdst=-1)

Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。

time.strftime(format[, t])
# 参数说明:
format -- 格式字符串。
t -- 可选的参数t是一个struct_time对象
python中时间日期格式化符号:

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

6.1.8 datetime模块

datetime的的主要用途是在编程过程中对时间的操作,例如用户输入时间,代码对时间进行操作,输入的时间为字符串,datetime不能直接对字符串进行操作,需要将str类型的对象转换为datatime类型,等时间处理结束后再将datetime转换为str。

  • datetime数据类型:

    ​ datetime.datetime.

  • 格式:

    ​ import datetime / form datetime import datetime

下面介绍time datatime str之间的转换及datetime 的加减运算。

import time
from datetime import datetime,timezone,timedelta

# ###########获取datetiem格式的时间 ###############
v1=datetime.now() 
#当前本地时间
print(v1)

tz=timezone(timedelta(hours=-8))
print(tz) 
#UTC-08:00

v2=datetime.now(tz)
print(v2) 
#2020-07-28 21:40:33.247303-08:00

#当前UTC时间
v3=datetime.utcnow() 
print(v3)

# ####### 把datetime格式转换为字符串 strftime ###########
v4=datetime.now()
print(v4,type(v4))  
#<class 'datetime.datetime'>

val=v4.strftime("%Y-%m-%d_%H:%M:%S")
print(val) 
#2022-07-29_13:46:51

# ############# 把字符串转换为datetime格式 strptime ################
v5="2022-07-29 05:46:51"
v6=datetime.strptime(v5,'%Y-%m-%d %H:%M:%S')
print(v6,type(v6)) 
#2022-07-29 05:46:51 <class 'datetime.datetime'>

# ##############  datetime时间加减法(datetime格式的时间)  ##################
ctime=datetime.strptime("2022-11-09",'%Y-%m-%d')  
#字符串转换为datetime格式
print(ctime,type(ctime))

v7=v6 + timedelta(days=300,hours=23)
print(v7,type(v7)) 
#2023-05-26 04:46:51 <class 'datetime.datetime'>

v8=v7.strftime('%Y-%m-%d_%H:%M:%S')
print(v8,type(v8)) 
#2023-05-26_04:46:51 <class 'str'>

# ############ 时间戳和datetime的关系 ###############
# datetime.fromtimestamp() #floatz转换为datetime
# x.timestamp() #datetime转换为float

v9=time.time()
print(v9)
# 1564383477.6582062

v10=datetime.fromtimestamp(v9)
print(v10,type(v10))
#2019-07-29 14:57:57.658206 <class 'datetime.datetime'>

v11=datetime.now()
v12=v11.timestamp()
print(v11,type(v11),v12,type(v12))
# 2019-07-29 14:57:57.658206 <class 'datetime.datetime'> 1564383477.658206 <class 'float'>

6.1.9 序列化 json & pickle

json模块和pickle模块

  • json,传输的是字符串(str)优点:所有语言通用;缺点:只能系列化基本的数据类型 list/dict/int...

  • pickle,传输的是字节(bytes)优点:python中什么都可以序列化 缺点:序列化后的数据只有python能识别。夸语言平台差

  • json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中。

  • json是一个特殊的字符串(有点像列表中、字典、数字、布尔值组合而成的),程序和程序之间交互需要用到json。

    1. 把一个数据转换为json格式----序列化
    2. 把json格式的数据转换为列表元组字典等格式----反序列化
  • json格式要求

    1. 最外层必须是个容器类型(列表)
    2. 在json中如果包含字符串,必须是双引号(“abc”)【单引号,只有python能识别,其他语言不能识别】
  • json格式转换

    1. 序列化和反序列化

      • json.dumps() #序列化
      • json.loads() #反序列化
      # 案例1.
      v1=[12,21,"alice",{"k1":"v1"},True,('12','中文')]
      
      import json
      #序列化:将python格式的数值转换为json格式的字符串
      v2=json.dumps(v1)
      print(v2,type(v2))
      # [12, 21, "alice", {"k1": "v1"}, true, ["12", "\u4e2d\u6587"]] <class 'str'>
      
      #反序列化:将json格式的数值转换为python格式的字符串
      v3=json.loads(v2)
      print(v3,type(v3))
      # [12, 21, 'alice', {'k1': 'v1'}, True, ['12', '中文']] <class 'list'>
      
      # 因为有单引号总是报错
      # v7="[12, 21, 'alice', {'k1': 'v1'}, True, 'hello world!']"  
      # print(json.loads(v7))
      
      
    2. 序列化和反序列化存储

      • json.dump() #
      • json.load() #
      import json
      data=[1,{'k1':'M1','K2':'M2'},('LIFT','IS','COOL'),'&&','^%&*(中国)']
      
      with open('1.txt','w',encoding='utf-8') as f:
          json.dump(data,f)  #(数据,文件)
      
      with open('1.txt','r',encoding='utf-8') as f:
          v1=json.load(f)  #加载json文件
      print(v1,type(v1)) 
      [1,{'k1': 'M1', 'K2': 'M2'}, ['LIFT', 'IS', 'COOL'], '&&', '^%&*(中国)'] <class 'list'>
      
    3. json.dumps(filename,ensure_ascii=False) #加入ensure_ascii=False就会取消中文转译unicode

    注意事项:

    json序列化中文

    import json
    val1={'k1':'二代','k2':'sang'}
    v11=json.dumps(val1)
    print(v11) 
    #{"k1": "\u4e8c\u4ee3", "k2": "sang"} ,其中的中文会转译成unicode
    
    v12=json.dumps(val1,ensure_ascii=False)
    print(v12) 
    #{"k1": "二代", "k2": "sang"} ,加入ensure_ascii=False就会取消转译
    
  • python格式转换为json后的数据类型
    1.dict ---- object
    2.list,tuple - ---array(数组)
    3.str ---- string
    4.int,flort ---- number
    5.True ---- true
    6.False ---- false
    7.None ---- null

  • pickle序列化功能强大几乎可以序列化所有类型的数据,但职能应用在python中。

加载:import pickle

格式:

  • pickle.dumps() #序列化
  • pickle.loads() #反序列化
  • pickle.load(data,filename) #序列化到文件
  • pickle.dump(data,filename) #加载文件并反序列化

示例:

import pickle

# pickle.dumps() 序列化
# pickle.loads() 反序列化
v={1,2,3,4,5}
v1=pickle.dumps(v)
print(v1,type(v1))
# b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04K\x05e\x85q\x02Rq\x03.' <class 'bytes'>

v2=pickle.loads(v1)
print(v2,type(v2))
# {1, 2, 3, 4, 5} <class 'set'>

# pickle.load(data,filename)
# pickle.dump(data,filename)
data="我爱你中国!"
with open('1.txt','wb') as filename:
    pickle.dump(data,filename)

with open('1.txt','rb') as filename:
    v1=pickle.load(filename)
    print(v1,type(v1))
# 我爱你中国! <class 'str'>

6.1.10 logging模块

未完待续.......

6.2 第三方模块

  • pip ---py.pip.org(包管理地址)

    python36 -m pip install --upgrade pip #安装或者更新pip

    pip install pdf2  安装pdf2模块
    

xlrd模块(打印excel文件)

6.3 自定义模块

  • import 自动以.py;
  • 调用方式:自定义.函数名()

6.3.1 模块定义

  • 定义文件类型 package_name/model_name.py
    def func_name1:
    print("func_name1")
    def func_name2:
    print("func_name2")

  • 定义包类型 package_name/model_name.py

    __init__.py

    ​ model_name.py

6.3.2模块调用

  • 导入:
    • import model_name #导入模块
    • from model_name import func_name1,func_name2 #导入模块中的个别功能
    • from model_name import * #导入所有功能
    • 4.from model_name import func_name1,func_name2 as fname1,fname2 #函数别名
    • import package_name.model_name
    • from package_name.model_name import func_name2 as fname1
  • 调用:
    - model_name.func_name()
    - func_name1()
    - func_name1()
    - fname1()
    - package_name.model_name.func_name()
    - fname1()

​ 注意事项:
​ 模块可以是py文件也可以是包(通俗就是文件夹),import package.model_name.py
​ 定义包形式的模块:py2中必须有__init__.py文件标识,py3不需要(推荐不论是py2 or py3都加上__init__.py

posted @ 2019-08-31 15:55  PlayOn  阅读(133)  评论(0)    收藏  举报