Week1《情报密码锁》作业
1. 作业内容
自己写一个加密程序,能够加密的内容是英文和汉字。同时加密并且解密 就是说,一段话中既有中文又有英文,标点符号不用处理。 加密规则,获取ascii码数字,中间用|分割
思路提示:
print(ord("我"))
print(chr(25105))
扩展内容: 自定义规则玩起来
2. 代码实现
# 加密文件
def encode(old_filename, new_filename):
with open(f'./{old_filename}', encoding='utf-8') as f1:
old_chars = list(f1.read())
new_chars = []
for char in old_chars:
t = ord(char)
# 判断是否为英文字母或汉字
if ('a' <= char <= 'z') | ('A' <= char <= 'Z') | (0x4e00 <= t <= 0x9fa5):
new_chars.append(str(t))
else:
new_chars.append(char)
result = '|'.join(new_chars)
with open(f'./{new_filename}', 'w') as f2:
f2.write(result)
# 解密文件
def decode(old_filename, new_filename):
with open(f'./{old_filename}', 'r', encoding='utf-8') as f1:
old_chars = f1.read().split('|')
new_chars = []
for char in old_chars:
if char.isdigit():
new_chars.append(chr(int(char)))
else:
new_chars.append(char)
result = ''.join(new_chars)
with open(f'./{new_filename}', 'w') as f2:
f2.write(result)
if __name__ == '__main__':
while True:
print('-'*30, '请输入你想进行的操作:', '1. 加密文件', '2. 解密文件', '3. 退出', sep='\n')
ans = input('请选择:')
if ans == '1':
file = input('请输入待加密文件名: ')
new_file = input(r'请输入加密后文件名(.txt): ')
try:
encode(f'./{file}', f'{new_file}.txt')
print('\033[0;32m', '加密成功,请到原目录下查看\n', '\033[0m', sep='')
except FileNotFoundError:
print('\033[0;31m', '输入文件名有误,请重新输入!', '\033[0m', sep='')
elif ans == '2':
file = input('请输入待解密文件名: ')
new_file = input(r'请输入解密后文件名(.txt): ')
try:
decode(f'./{file}', f'{new_file}.txt')
print('\033[0;32m', '解密成功,请到原目录下查看\n', '\033[0m', sep='')
except FileNotFoundError:
print('\033[0;31m', '输入文件名有误,请重新输入!', '\033[0m', sep='')
elif ans == '3':
break
else:
print('\033[0;31m', "无此选项,请重新输入!", '\033[0m', sep='')
3. 效果演示:
4. 知识点总结
-
文件遍历
# 打开文件 f = open('./test.txt', 'r')
方法一:直接遍历
for line in f: print(line)
方法二:
.readline()
, 一次读一行line = f.readline() while line: print(line) line = f.readline()
方法三:
.readlines()
,一次读取所有行,返回一个列表lines = f.readlines() for line in lines: print(line)
方法四:
.read()
,一次读取所有内容,返回一个字符串print(f.read())
-
终端字符颜色
终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关,shell,python,perl等均可以调用。 转义序列是以 ESC 开头,可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27, 用八进制表示是33)。
格式
\033[显示方式;前景色;背景色m
项目 | 参数 |
---|---|
显示方式 | 0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显) |
前景色(3_) | 0(黑色),1(红色),2(绿色), 3(黄色), 4(蓝色), 5(洋红), 6(青色), 7(白色) |
背景色(4_) | 0(黑色),1(红色),2(绿色), 3(黄色), 4(蓝色), 5(洋红), 6(青色), 7(白色) |
常用
-
\033[0m
:默认 (黑底白色)
\033[1;32;40m
:黑底绿色
\033[1;31;40m
:黑底红色 -
前景色
-
背景色