1,自定义模块的补充
创建tbjx.py文件
# print('from the tbjx.py')
name = '太白金星'
def read1():
print('tbjx模块:', name)
def read2():
print('tbjx模块')
read1()
def change():
global name
name = 'barry'
print(name)
# print(__name__) # 根据文件的角色(脚本,模块)不同返回的值不同
# 当tbjx.py做脚本时:__name__ = __main__ 返回True
# 当tbjx.py做模块被别人引用时:__name__ = tbjx
# __name__根据文件根据文件的角色(脚本,模块)不同返回的值不同
# 1,模块需要调试时加上if __name__ == '__main__':
# change() # 测试代码 在脚本里用会输出barry,在模块里还是会输出barry.
# if __name__ == '__main__': # 此时change()只会在脚本里执行,不会再模块里执行
# change()
# 2,作为项目的启动文件时需要。
# 第一次导入模块发生三件事情 ''' 在内存在创建一个以tbjx命名的名称空间。 执行此名称空间所有的可执行代码(将tbjx.py文件中所有变量与值的对用关系加载到这个名称空间)。 通过tbjx.的方式引用模块里面的代码。 '''
test.py
import tbjx
tbjx.read2()
tbjx.read1()
# 第一次导入模块发生三件事情
'''
在内存在创建一个以tbjx命名的名称空间。
执行此名称空间所有的可执行代码(将tbjx.py文件中所有变量与值的对用关系加载到这个名称空间)。
通过tbjx.的方式引用模块里面的代码。
'''
# 当前是tbjx.py
# import tbjx
name = 'alex'
print(name) # alex
print(tbjx.name) # 太白金星
'''
from the tbjx.py
alex
太白金星
'''
def read1():
print(666)
#
read1()
tbjx.read1() # tbjx模块: 太白金星
'''
from the tbjx.py
tbjx模块: 太白金星
'''
name = '日天'
tbjx.change() # barry
print(name) # 日天
print(tbjx.name) # barry
'''
from the tbjx.py
日天
barry
'''
import tbjx as sm # 将tbjx更改名字为sm
print(sm.name)
起别名
将模块中的函数用同样的名称,就像index()函数可以在不用的数据类型情况下用相同的函数。
起别名的示例
模拟连接两个不同的数据库
创建两个py文件
mysql.py
# 原始方法:
def mysql():
print('连接mysql模块')
# 统一接口化
def db():
print('连接mysql模块')
oracle.py
# 原始方法
def oracle():
print('连接oracle模块')
# 统一接口化
def db():
print('连接oracle模块')
测试别名的文件
test2.py
# 原始方法
result = input('请输入要用的数据库:')
if result == 'mysql':
import mysql1
mysql1.db()
elif result == 'oracle':
import oracle1
oracle1.db()
# 起别名 统一接口化
result = input('请输入要用的数据库:')
if result == 'mysql':
import mysql1 as sm
elif result == 'oracle':
import oracle1 as sm
sm.db() # 统一接口,归一化思想
统一接口归一化思想在以后的开发中尤为重要,不能将程序写死。
这里可能案例比较简单,看不出多大的区别。
2,from....import....
from...import... 与import使用的区别
from tbjx import name
from tbjx import read2, read1
print(name)
print(read1())
print(read2())
print(globals())
read1()
本文件和引入的模块在变量命名是注意产生冲突
1,容易产生冲突,后者将提前覆盖
# 1,容易产生冲突,后者将提前覆盖
name = 'alex'
from tbjx import name
print(name) # name的位置不同,输出的值不同
from tbjx import read1
def read1():
print(666)
read1() # 666
2
from tbjx import read1
name = 'alex'
read1() # tbjx模块: 太白金星
'''
def read1():
print('tbjx模块:', name)
'''
def read1():
print('本文件', name)
read1()
3
from tbjx import change
from tbjx import name
name = 'alex'
print(name) # alex
change() # barry
print(name) # alex
注意使用
from tbjx import *
# 一般不这样写,如果要用必须将这个模块名中的名字全部记住
# __all__ = ['name', 'read1'] # 配合*使用 form tdjx import *是只能调用name和read1() 其他的单独引用还是可以使用的
# 但是可以配合__all__ 使用
print(name)
read1()
print(__name__) # 根据文件的角色(脚本,模块)不同返回的值不同
# 当tbjx.py做脚本时:__name__ = __main__ 返回True
# 当tbjx.py做模块被别人引用时:__name__ = tbjx
# __name__根据文件根据文件的角色(脚本,模块)不同返回的值不同
# 1,模块需要调试时加上if __name__ == '__main__':
change() # 测试代码 在脚本里用会输出barry,在模块里还是会输出barry.
if __name__ == '__main__': # 此时change()只会在脚本里执行,不会再模块里执行,||可以根据tbjx理解
change()
# 2,作为项目的启动文件时需要。
print(__name__)
# 模块的搜索路径
import tbjx
print(tbjx.name)
import sys
print(sys.modules) # 内置内容(内置函数,内置模块等等)
print(sys.path) # 输出文件路径
# import dz # 此时dz模块在09中和这个文件不在同一个文件夹下
# dz不在内存也不再内置,这两个都不能变唯一更变得就是路径,只有sys.parh可以操作
# print(dz) # 报错
import sys
sys.path.append(r'D:\python 代码文件\python全栈学习\09-python装饰器') # 在路径中添加dz模块所在的路径,然后再调用
# import dz
3,json模块
引入
# list--------->bytes # b1 = list.encode('utf-8') # 不能直接转换 # l1要先转化成字符串再转换成bytes
# l1要先转化成字符串再转换成bytes
s1 = str(l1)
b1 = s1.encode('utf-8') # 进行编码
print(b1, type(b1))
# alex接收了b1
s2 = b1.decode('utf-8') # 进行解码
print(s2, type(s2))
dumps,loads 用于网络传输,也可以读取文件
dic = {'username': '太白', 'password': 123, 'status': True}
#
import json
# dumps,loads 只能用于网络传输,但是也可以读取文件
# 编码成特殊的字符串
st = json.dumps(dic, ensure_ascii=False)
print(st, type(st)) # {"username": "太白", "password": 123, "status": true} <class 'str'>
# 反转回去
dic1 = json.loads(st)
print(dic1, type(dic1)) # {'username': '太白', 'password': 123, 'status': True} <class 'dict'>
l2 = [1, 2, 3, {'name':'alex'}]
# 转化成特殊字符串写入文件
with open('json文件', encoding='utf-8', mode='w') as f1:
st = json.dumps(l2)
f1.write(st)
# 将特殊字符串还原回去
with open('json文件', encoding='utf-8') as f2:
st2 = f2.read()
l2 = json.loads(st2)
print(l2, type(l2))
dump load 用于写入,读取文件,只能写入一个数据结构
# dump load 只能用于写入,读取文件,只能写入一个数据结构
l3 = [1, 2, 3, {'name': 'alex'}]
with open('json1文件', encoding='utf-8', mode='w') as f1:
json.dump(l3, f1)
# 读取数据
with open('json1文件',encoding='utf-8') as f2:
l2 = json.load(f2)
print(l2, type(l2))
一次写入多个数据
# 一次写入文件多个数据怎么做 用dumps和loads
dic1 = {'name': 'alex1'}
dic2 = {'name': 'alex2'}
dic3 = {'name': 'alex3'}
with open('json2文件', encoding='utf-8', mode='w') as f1:
json.dump(dic1, f1)
json.dump(dic2, f1)
json.dump(dic3, f1)
# 读取数据
with open('json2文件',encoding='utf-8') as f2:
print(json.load(f2)) # 只能读取一个报错
# 正确写法
dic1 = {'name': 'alex1'}
dic2 = {'name': 'alex2'}
dic3 = {'name': 'alex3'}
with open('json2文件', encoding='utf-8', mode='w') as f1:
f1.write(json.dumps(dic1) + '\n')
f1.write(json.dumps(dic2) + '\n')
f1.write(json.dumps(dic3) + '\n')
with open('json2文件', encoding='utf-8') as f2:
for i in f2:
print(json.loads(i))
4,hashlib模块
用途: 1,密码加密。不能以明文的形式存储密码。以密文的形式。 2,文件的校验。
1,数据加密
MD5
s1 = 'sfgjdfsbndfzbdfhfgjfgjkgfjndfgjesfghbsdfbfgsxdvzs老男孩教育'
s2 = '123'
import hashlib
ret = hashlib.md5()
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())
# 61aec2bc637b98e8112bec7a0808027c
# 202cb962ac59075b964b07152d234b70
普通加密
s1 = 'sfgjdfsbndfzbdfhfgjfgjkgfjndfgjesfghbsdfbfgsxdvzs老男孩教育'
import hashlib
ret = hashlib.md5()
print(ret) # <md5 HASH object @ 0x00000188FE5A4570>
ret.update(s1.encode('utf-8'))
print(ret.hexdigest()) # 61aec2bc637b98e8112bec7a0808027c 长度永远不会变
加盐
s2 = 'sdfhndsfh'
import hashlib
ret = hashlib.md5('太白金星'.encode('utf-8')) # '太白金星'.encode('utf-8') 这个称为盐,盐相同破译也非常的快
ret.update(s2.encode('utf-8'))
print(ret.hexdigest()) # 9962c41a621de38dbc1f6ff00e38b299
动态加密
s2 = 'sdfhndsfh'
import hashlib
ret = hashlib.md5('太白金星'[::2].encode('utf-8'))
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
练习
把输入的文件的密码加密
import hashlib
def MD5(pwd):
ret = hashlib.md5()
ret.update(pwd.encode('utf-8'))
return ret.hexdigest()
def register():
username = input('请输入用户名:').strip()
passwprd = input('请输入密码:').strip()
passwprd_md5 = MD5(passwprd)
with open('加密文件',encoding='utf-8',mode='a') as f1:
f1.write(f'\n{username} | {passwprd_md5}')
register()
sha系列
一般用不到,金融公司和安全公司可能会用 随着sha系列数字越高,加密越复杂,越不容易破解,耗时越长
s2 = 'sdfhndsfh'
import hashlib
ret = hashlib.sha512()
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
print(len(ret.hexdigest()))
数据加密是没有反向解密的,被破解是被试出来的,当我们登录账号忘记密码时,通过了身份验证后台为什么不直接告诉我们密码,而是让我们重新设置一个密码?。因为后台也不知道你的密码是多少,第一次设置密码时,后台将加密后的密码存到数据库中,以后每次登录输入的密码都会被相同的加密算法计算一遍,和数据库中的进行对比,加密后的字符串相同那密码正确,反之密码错误。这就是当我们登录账号忘记密码时,通过了身份验证后台为什么不直接告诉我们密码,而是让我们重新设置一个密码的原因。
2,文件校验
python中一切皆对象,Linux中一切皆文件:文本文件,非文本文件,音频,视频,图片 无论是下载的视频,还是软件(国外的软件),往往都会有md5值
以pycharm为例
进入下载页面可以看到一个SHA-256的校验码。
防止下载的软件被篡改,以及是否为官网下载的
校验方法:
def file_md5(path):
ret = hashlib.md5()
with open(path, mode='rb') as f1:
b1 = f1.read()
ret.update(b1)
return ret.hexdigest()
result = file_md5('json文件')
print(result) # 2e26d4ad39e63add4f129f9b2c8aa132c7c356f18b13ad1952bee37e88452bb5
校验软件,可以直接将软件复制到目录下,用rb的方式读取软件进行校验,得到的校验码和官网上的进行比较
5,pickle模块
pickle模块dumps loads 只能用于网络传输
l1 = [1, 2, 3, {'name': 'alex'}]
# pickle模块dumps loads 只能用于网络传输
import pickle
st = pickle.dumps(l1)
print(st) # b'\x80\x03]q\x00(K\x01K\x02K\x03}q\x01X\x04\x00\x00\x00nameq\x02X\x04\x00\x00\x00alexq\x03se.'
l2 = pickle.loads(st)
print(l2) # [1, 2, 3, {'name': 'alex'}]
pickle模块dump load 只能用于文件写入
import pickle
# 文件写入
dic1 = {'name': 'alex1'}
dic2 = {'name': 'alex2'}
dic3 = {'name': 'alex3'}
f = open('pick多数据', mode='wb')
pickle.dump(dic1, f)
pickle.dump(dic2, f)
pickle.dump(dic3, f)
f.close()
# 文件读取
f = open('pick多数据', mode='rb')
print(pickle.load(f))
print(pickle.load(f))
print(pickle.load(f))
f.close()
import pickle
def func():
print('in func')
# 写入
f = open('pick对象', mode='wb')
pickle.dump(func, f)
f.close()
# 读取
f = open('pick对象', mode='rb')
ret = pickle.load(f)
print(ret) # <function func at 0x000001E6B2A6AB88>
ret() # in func
更多内容可以查看自己学python的过程,简单笔记。-CSDN博客
更多内容可以查看自己学python的过程,简单笔记。-CSDN博客
更多内容可以查看自己学python的过程,简单笔记。-CSDN博客