异常捕获
import hashlib
hash摘要(加密)的算法主要有两类:md5和sha-X系列
- hash加密的特点
"""
1) hash算法生成的摘要不可逆。(不能通过密文来获取原文)
2) 只有相同的数据通过相同算法得到的摘要才是一致的
3) 不管原数据多大,产生的摘要的大小(长度)一致。
"""
- 生成hash摘要
# 1. 通过算法创建hash对象:hashlib.算法名()
算法名:md5、shaXXX
hash = hashlib.sha512()
# 2) 添加数据
hash对象.update(数据)
注意:数据必须是二进制数据,类型是bytes
补充:二进制和字符串指甲你得相互转换:
"""
字符串转二进制:
bytes(字符串, encoding='utf-8')
字符串.encode()
二进制转字符串
str(二进制, encoding='utf-8')
二进制.decode()
"""
hash.update(bytes('12345', encoding='utf-8'))
hash.update('123456'.encode())
- 获取摘要
result = hash.hexdigest()
print(result) # e10adc3949ba59abbe56e057f20f883e
# 练习:判断文件内容是否被修改
hash = hashlib.md5()
with open('day7作业.mp4','rb') as f:
hash.update(f.read())
print(hash.hexdigest())
数据持久化
- 数据持久化
"""
程序中保存的数据默认都是保存在运行内存中的,在程序运行结束的时候都会被释放。
如果希望这次运行程序产生的数据在下一次运行程序的时候还能用,就需要将数据保存到硬盘中(磁盘中)。
将数据保存到硬盘的过程就是数据持久化的过程。
硬盘保存数据的基本单元是文件,所以如果要将数据保存到硬盘中,只需要将数据保存在文件中。
程序中数据持久化的常用文件类型:数据库文件(.db、.sqlite等)、plist文件、json文件、txt文件、
二进制文件(图片、视频、音频、exe可执行文件)
"""
- 文件操作 - 操作文件的内容
"""
文件操作基本流程: 打开文件 -> 操作文件(读、写) -> 关闭文件
"""
# 1) 打开文件
"""
open(file, mode='r', *, encoding=None) - 以指定方式打开指定文件,返回一个文件对象
a.file - 需要打开的文件在计算机中的位置信息(文件路径), 字符串
绝对路径:文件在计算机中的全路径(一般从盘开始写)
相对路径:. - 表示当前目录(当前代码文件所在的文件夹), ./可以省略
.. - 表示当前目录的上层目录
b. mode - 文件打开方式,决定打开文件后后续能对该文件进行的操作以及操作数据的类型。
第一组:'r'、'w'、'a' - 控制后续操作(是读还是写)
'r' - 只读
'w' - 只写, 会清空原文件内容
'a' - 只写, 会保留原文件内容
第二组:'t'、'b' - 控制操作数据的类型
't' - 读操作返回的数据和写操作写入的数据是字符串(str)
'b' - 读操作返回的数据和写操作写入的数据是二进制(bytes)
第一组必须选一个,第二组可以不选,不选的时候默认是t
注意:1.二进制文件打开的时候必须带b
c. encoding - 文本文件的编码方式(需要保证写入数据采用的什么方式进行编码,读数据的时候就需要对应的方式解码),
一般采用utf-8,但是很多windows文本默认编码方式是gbk
注意:只有在以t的方式打开文本文件的时候才需要考虑给encoding赋值
"""
路径
# =========绝对路径===========
open(r'/Users/yuting/授课/python2103/01语言基础/day14-异常捕获和文件操作/合同.txt')
# =========相对路径==========
open(r'./合同.txt’)
open('合同.txt')
open('./res/a.txt')
open('../day14-异常捕获和文件操作/合同.txt')
# ========r是只读=========
f = open('./合同.txt', 'r')
f.read()
f.write('abc') # io.UnsupportedOperation: not writable
# ========a是只写,并且保留原文件内容=======
f = open('./合同.txt', 'a')
f.write('abc')
f.read() # io.UnsupportedOperation: not readab
# ========w是只写,并且会清空原文件内容=======
f = open('./合同.txt', 'w')
f.write('abc')
f.read() # io.UnsupportedOperation: not readable
# =========t,操作数据是字符串======
f = open('./合同.txt', 'rt')
content = f.read()
print(type(content)) # <class 'str'>
# =========b,操作数据是二进制======
f = open('./合同.txt', 'rb')
content = f.read()
print(type(content)) # <class 'bytes'>
f = open('day7作业.mp4', 'rb')
f.read()
2. 关闭文件
# 文件对象.close()
f.close()
f.read() # ValueError: read of closed file
3. 操作
# a. 读操作
"""
文件对象.read() - 从读写位置开始,读到文件结束。(读写位置默认在文件开头)
文件对象.readline() - 从读写位置开始,读到一行结束
"""
f = open('./res/a.txt', encoding='utf-8')
print('============1==============')
print(f.read())
print('=============2=============')
f.seek(0) # 将读写位置移动到文件开头
print(f.read())
print('=============3=============')
f.seek(0)
print(f.readline())
print('=============4=============')
print(f.readline())
print('=============5=============')
print(f.read())
print('=============6=============')
f.seek(0)
print(f.readlines()) # ['床前明月光,\n', '疑是地上霜。\n', '举头望明月,\n', '低头思故乡。']
# b. 写操作
# 文件对象.write(数据) - 将数据写入指定文件中
f = open('./res/a.txt', 'w', encoding='utf-8')
f.write('abc')
数据持久化
"""
1)用一个文件来保存需要持久化的数据
2)程序中需要这个数据的时候就从文件中读取这个数据
3)如果数据发生改变,需要把最新的数据再写入文件中
"""
# 写一个程序打印程序执行的次数
f= open('count.txt', encoding='urf-8')
count = int(f.read())
count += 1
print(count)
f = open('count.txt', 'w', encoding='utf-8')
f.write(str(count))
# 2. eval函数
result = eval('100')
print(result, type(result))
result = eval(12.5)
print(result, type(result))
result = eval([10, 20, 30])
print(result, type(result), result[-1])
result = eval("""
{
'name': '小明',
'age': 18,
'scores': [90, 88, 76, 99]
}
""")
print(result, type(result))