文本分析与加密
类型:字符串
描述
读取文件中的内容为字符串可以用以下函数实现:
# 读文件,返回字符串,file为文件名变量,若为文件名时,须为字符串类型
def read_file(file):
with open(file, 'r', encoding='utf-8') as f:
return f.read() # 返回值为字符串
读取附件中的文件,完成以下操作:
- 分类统计文件中大写字母、小写字母、数字、空白字符(包括空格、\n、\t等,可用
isspace()
方法判断)和其他字符的数量 - 输出文件中单词的数量(将其中所有标点符号替换为空格,再根据空格对字符串进行切分可以得到元素为单词的列表。数字按单词统计,如“ 1994” 计算一个单词)
- 用恺撒加密方法对上述文件内容进行加密,为提高加密强度,约定输入一个秘密单词来产生偏移量,偏移量计算方法为先计算用户输入的字符串中每个字符的ASCII值的和,再对26取模,结果作为偏移量。为避免偏移量恰好为0,本题约定秘密单词为用于表示星期几的单词,即’Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, 'Sunday’中的一个。
在密码学中,凯撒密码是一种最简单且最广为人知的加密技术。“恺撒密码”据传是古罗马恺撒大帝用来保护重要军情的加密系统。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推,小写字母也一样处理,其他字符忽略,不作任何改变。
输入格式
一个代表星期几的单词,‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, 'Sunday’中的一个
输出格式
依序输出:
- 文件中大写字母、小写字母、数字、空白字符和其他字符的数量
- 文件中单词的数量
- 偏移量
- 用恺撒加密方法对上述文件内容进行加密的结果
示例 1
输入:
Tuesday
输出:
16 306 11 84 17
共有86单词
7
Ayplk 3 aptlz mvy bupclyzpaf. Hss mhpslk.
P hwwsplk mvy Ohychyk mvy 10 aptlz. Hss mhpslk, aolf kvu’a lclu dhua av zll tl.
Mvy aol shza aptl, P dlua av aol alhjolyz’ jvsslnl dopjo dhz jvuzpklylk aol aopyk vy mvbyao jshzz vm tf jpaf.
P hwwsplk qviz mvy 30 aptlz. Nva ylqljalk.
Pa dhz zv kpmmpjbsa ha aoha aptl, P dhz zv mybzayhalk.
Iljhbzl P ahbnoa pu aol bupclyzpaf. Tf whf dhz $10 h tvuao.
Iljhbzl P jvbsk uva mpuk h nvvk qvi pu 1994.
参考答案
# -------- ------- --------
# @Author : 赵广辉
# @Contact: vasp@qq.com
# @Company: 武汉理工大学
# @Version: 1.0
# @Modify : 2022/06/13 11:33
# Python程序设计基础,赵广辉,高等教育出版社,2021
# Python程序设计基础实践教程,赵广辉,高等教育出版社,2021
# -------- ------- --------
import string
# 读文件,返回字符串
def read_file(file):
with open(file, 'r', encoding='utf-8') as f:
return f.read()
# 统计大写字母、小写字母、数字、空格和其他字符的数量
def classify_char(txt):
upper, lower, digit, space, other = 0, 0, 0, 0, 0
for ch in txt:
if ch.islower():
lower = lower + 1
elif ch.isupper():
upper = upper + 1
elif ch.isnumeric():
digit = digit + 1
elif ch.isspace():
space = space + 1
else:
other = other + 1
return upper, lower, digit, space, other
# 用空格替换所有符号,切分为列表
def word_list(txt):
for ch in '!"#$%&()*+,-.:;<=>?@[\\]^_’‘{|}~/':
txt = txt.replace(ch, " ") # 所有符号替换为空格
# print(txt)
return txt.split() # 切分为列表,返回列表
# 返回单词数量
def number_of_words(ls):
total_words = len(ls) # 列表长度
return total_words # 列表长度即单词个数
# 用字符串中字符ASCII值的和对26取模为偏移量
def offset_cal(day):
sum_of_ch = 0
for c in day:
sum_of_ch = sum_of_ch + ord(c)
offset = sum_of_ch % 26
return offset
def kaisa(txt, number):
lower = string.ascii_lowercase # 小写字母
upper = string.ascii_uppercase # 大写字母
before = string.ascii_letters
after = lower[number:] + lower[:number] + upper[number:] + upper[:number]
table = ''.maketrans(before, after) # 创建映射表
return txt.translate(table)
if __name__ == '__main__':
filename = 'mayun.txt' # 读取的文件名
text = read_file(filename) # text为字符串
words_list = word_list(text) # 单词的列表
words_counts = number_of_words(words_list)
# weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
secret_word = input()
offset_number = offset_cal(secret_word)
print(*classify_char(text))
print(f'共有{words_counts}单词')
print(offset_number)
print(kaisa(text, offset_number))