文章目录
- python实现加解密文本文件(一)
- 一.异或操作
- 二.字节串和字符串
- 三.int.from_bytes函数
- 四.json模块
- 五.pathlib库的Path类
python实现加解密文本文件(一)
在做实验之前,先对一些知识加深一下了解~~~~
一.异或操作
python中的位运算符’^’,在计算时按位异或,相同值异或为0,不同值异或为1.
eg: 0^0 = 0, 0^1 = 1
注意:这里按位异或,所以不管输入的是十进制数还是十六进制数等,计算机内部都会将其转化成二进制数,并进行右对齐,必要时会在前面补0,且满足结合律。
eg: 3^2 = (011)^(010) = (001) = 1
2^3^5 = 2^(3^5) = 4
所以我们要对文件进行加密,首先要将文件转化为二进制数,再生成与这个二进制数对应的、等长的随机密钥,然后将这个二进制数与随机密钥进行异或操作,得到的即为加密后的异或操作。
解密时,将这个二进制数和原来的密钥进行异或操作,得到的即为初始的二进制数,最后再将初始的二进制数转化为对应的文本文件。
生成随机密钥的函数:secrets模块中的token_bytes库函数
二.字节串和字符串
字符 是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在UTF-8编码 中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3个字节。一个英文就用八位二进制数表示,一个汉字就用3个八位二进制表示
字符串是字符序列,它是一种抽象的概念,不能直接存储在硬盘。
字节串是字节序列,它可以直接存储在硬盘。它们之间的映射被称为编码/解码。
简单来说,就是字节串是给计算机看的,给计算机传输或者保存的,而字符串是给人看的,用来操作的。
在Python中,程序中的文本都用字符串表示。
#字节串
byte_str = b'Our love can not tolerate other people.'
print(type(byte_str))
<class 'bytes'>
#字符串
text_str = 'Our love can not tolerate other people.'
print(type(text_str))
<class 'str'>
#二者的转化(字符串编码后得到对应的字节串,字节串解码后得到对应的字符串)
print(text_str.encode('utf-8'))
b'Our love can not tolerate other people.'
print(byte_str.decode('utf-8'))
Our love can not tolerate other people.
三.int.from_bytes函数
功能:res = int.from_bytes(x)的含义是把bytes类型的变量x,转化为十进制整数,并存入res中。其中bytes类型是python3特有的类型。
函数参数:int.from_bytes(bytes, byteorder)。在IDLE或者命令行界面中使用help(int.from_bytes)命令可以查看具体介绍。bytes是输入的变量;byteorder主要有两种:'big'和'little',是高低位标志,’big‘表示高位在前,’little‘表示低位在前。
四.json模块
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
json提供了四个方法:dumps、dump序列化方法,loads、load反序列化方法
dumps:将数据通过特殊的形式转换为所有程序语言都认识的字符串
dump:将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
loads:将json编码的字符串再转换位python数据结构
load:从数据文件中读取数据,并将json编码的字符串再转换位python数据结构
eg:
>>> import json
>>> json.dumps([]) # dumps可以格式化所有的基本数据类型为字符串
'[]'
>>> json.dumps(1) # 数字
'1'
>>> json.dumps('1') # 字符串
'"1"'
>>> dict = {"name":"Tom", "age":23}
>>> json.dumps(dict) # 字典
'{"name": "Tom", "age": 23}'
import json
with open("test.json", "r", encoding='utf-8') as f:
aa = json.loads(f.read())
f.seek(0)
bb = json.load(f) # 与 json.loads(f.read())
print(aa)
print(bb)
# 输出:
{'name': 'Tom', 'age': 23}
{'name': 'Tom', 'age': 23}
五.pathlib库的Path类
1.调用库
from pathlib import Path
2.创建Path对象
path = Path(path)
3.Path.cwd() 获取当前文件路径
cwd = Path.cwd()
print(cwd) #输出当前文件的路径
4.Path.exists() 判断当前路径是否是文件或文件夹
Path(path).exists()
返回True或者False
5.Path.mkdir(mode=0o777,parents=Fasle) 根据路径创建文件夹
parents=True时,会依次创建路径中间缺少的文件夹
p_new = p/'xxx'
p_new.mkdir() #创建一个名为xxx的文件夹
p_news = p/'A/B'
p_news.mkdir(parents=True) #创建一个A文件夹,并在A文件夹下创建B文件夹
6.Path.open(mode=’r’, buffering=-1, encoding=None, errors=None, newline=None) 打开文件夹
7.路径操作
from pathlib import Path
p1 = Path()
p2 = Path('a','b','c/d')
p3 = Path('/abc')
print(p1,p2,p3)
#输出:. a\b\c\d \abc
路径拼接和分解:
操作符/ Path对象/Path对象;Path对象/字符串;字符串/Path对象
分解:parts属性,可以返回路径中的每一部分
from pathlib import Path
p = Path()
p = p/'a'
p1 = 'b'/p
p2 = Path('/c')
p3 = p2 / p1
print(p3)
print(p3.parts)
#输出:\c\b\a
# ('\\', 'c', 'b', 'a')
8.Path.name 获取path路径最后一级的文件名