接收一个字符串method为参数,根据参数值调用不同函数实现对文本的加密和解密。
method 值为 '统计字符'时,统计并输出文本中不同类型字符的数量并输出。
method 值为 '统计单词'时,统计并输出文本中单词的数量。
method 值为 '首字符'时,将所有单词的首字符提取出来拼接为一个字符串输出。
method 值为 '凯撒加密'时,再输入一个单词做为密钥发生器,用于计算偏移量,对文件中的内容进行加密并输出。
import string
def judge(method, txt):
if method == '1':
classify = classify_char(text)
print('大写字母{}个,小写字母{}个,数字{}个,空格{}个,其他{}个'.format(*classify))
elif method == '2':
word_lst = word_list(text) # 单词的列表
words_counts = number_of_words(word_lst)
print(f'共有{words_counts}单词')
elif method == '3':
word_lst = word_list(text) # 单词的列表
new_str = first_letter(word_lst)
print(f'拼接的字符串是{new_str}')
elif method == '4':
key = input('输入一个用于计算偏移量的单词:') # 输入一个用于计算偏移量的单词
offset = cal_offset(key) # 计算偏移量
print(caesar_cipher(text, offset)) # 加密
else:
print('输入错误')
def read_file(file):
with open(f'D:\pycharm\PycharmProjects/{file}.txt', 'r', encoding='utf-8') as f:
return f.read() # 读取文件中的内容为一个字符串
def classify_char(txt):
count=0
count1=0
count2=0
count3=0
count4=0
L = txt.__len__();
for i in range(L):
if txt[i]>='A' and txt[i]<='Z':
count+=1
elif txt[i]>='a' and txt[i]<='z':
count1+=1
elif txt[i]>='0' and txt[i]<='9':
count2+=1
elif txt[i]==" ":
count3+=1
else :
count4+=1
return (count,count1,count2,count3,count4)
def word_list(txt):
m = '!"#$%&()*+,-.:;<=>?@[\\]^_‘{|}~/'
for f in txt:
if f in m:
txt = txt.replace(f, ' ')
return txt.split()
def number_of_words(ls):
return len(ls)
def first_letter(ls):
str=''
for i in ls:
str+=i[0]
return str
def cal_offset(key_word):
sum = 0
for i in key_word:
sum+=ord(i)
sum = sum%9
return sum
def caesar_cipher(text, offset):
s1='abcdefghijklmnopqrstuvwxyz'
s2=s1.upper()
s3=[0,1,2,3,4,5,6,7,8,9]
s=[]
for i in text:
if i>='a' and i<='z':
for k in range(s1.__len__()):
if i==s1[k]:
s.append(s1[(k+offset)%25])
elif i>='A' and i<='Z':
for k in range(s2.__len__()):
if i==s2[k]:
s.append(s2[(k+offset)%25])
elif i>='0' and i<='9':
for k in range(s3.__len__()):
if int(i)==s3[k]:
s.append(str(s3[(k+offset)%10]))
else:
s.append(i)
w = ''.join(s)
return w
if __name__ == '__main__':
while True:
again = input("按任意键继续,结束请输入'no':")
if again == 'no':
break
filename = input('请输入要处理的文件名:') # 输入要处理的文件名
methods = input("输入要进行的操作编号(1.'统计字符';2.'统计单词';3.'首字符';4.'凯撒加密'):") # 输入要进行的操作
text = read_file(filename) # text为读文件获得的字符串
judge(methods, text) # 调用函数,输出处理结果
'''
示例如下:
>> 按任意键继续,结束请输入'no':
>> 请输入要处理的文件名:my
>> 输入要进行的操作编号(1.'统计字符';2.'统计单词';3.'首字符';4.'凯撒加密'):1
大写字母16个,小写字母306个,数字11个,空格84个,其他17个
>> 按任意键继续,结束请输入'no':
>> 请输入要处理的文件名:my
>> 输入要进行的操作编号(1.'统计字符';2.'统计单词';3.'首字符';4.'凯撒加密'):2
共有85单词
>> 按任意键继续,结束请输入'no':
>> 请输入要处理的文件名:my
>> 输入要进行的操作编号(1.'统计字符';2.'统计单词';3.'首字符';4.'凯撒加密'):3
拼接的字符串是T3tfuAfIafHf1tAftdewtsmFtltIwtttcwwcttofcomcIajf3tGrIwsdattIwsfBItituMpw1amBIcnfagji1
>> 按任意键继续,结束请输入'no':
>> 请输入要处理的文件名:my
>> 输入要进行的操作编号(1.'统计字符';2.'统计单词';3.'首字符';4.'凯撒加密'):4
>> 输入一个用于计算偏移量的单词:ecut
Usjfe 4 ujnft gps vojwfstjuz. Bmm gbjmfe.
J bqqmjfe gps Ibswbse gps 21 ujnft. Bmm gbjmfe, uifz epo’u fwfo xbou up tff nf.
Gps uif mbtu ujnf, J xfou up uif ufbdifst’ dpmmfhf xijdi xbt dpotjefsfe uif uijse ps gpvsui dmbtt pg nz djuz.
J bqqmjfe kpct gps 41 ujnft. Hpu sfkfdufe.
Ju xbt tp ejggjdvmu bu uibu ujnf, J xbt tp gsvtusbufe.
Cfdbvtf J ubvhiu jo uif vojwfstjuz. Nz qbz xbt $21 b npoui.
Cfdbvtf J dpvme opu gjoe b hppe kpc jo 2005.
>> 按任意键继续,结束请输入'no':no
'''