文本分析与加密

类型:字符串

描述

读取文件中的内容为字符串可以用以下函数实现:

# 读文件,返回字符串,file为文件名变量,若为文件名时,须为字符串类型
def read_file(file):
    with open(file, 'r', encoding='utf-8') as f:
        return f.read()        # 返回值为字符串

读取附件中的文件,完成以下操作:

  1. 分类统计文件中大写字母、小写字母、数字、空白字符(包括空格、\n、\t等,可用isspace()方法判断)和其他字符的数量
  2. 输出文件中单词的数量(将其中所有标点符号替换为空格,再根据空格对字符串进行切分可以得到元素为单词的列表。数字按单词统计,如“ 1994” 计算一个单词)
  3. 用恺撒加密方法对上述文件内容进行加密,为提高加密强度,约定输入一个秘密单词来产生偏移量,偏移量计算方法为先计算用户输入的字符串中每个字符的ASCII值的和,再对26取模,结果作为偏移量。为避免偏移量恰好为0,本题约定秘密单词为用于表示星期几的单词,即’Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, 'Sunday’中的一个。

在密码学中,凯撒密码是一种最简单且最广为人知的加密技术。“恺撒密码”据传是古罗马恺撒大帝用来保护重要军情的加密系统。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推,小写字母也一样处理,其他字符忽略,不作任何改变。

输入格式

一个代表星期几的单词,‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, 'Sunday’中的一个

输出格式

依序输出:

  1. 文件中大写字母、小写字母、数字、空白字符和其他字符的数量
  2. 文件中单词的数量
  3. 偏移量
  4. 用恺撒加密方法对上述文件内容进行加密的结果

示例 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))