字符串、文件操作,英文词率统计预处理

该作业要求来于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2684

1.字符串操作:

  • 解析身份证号:生日、性别、出生地等。
  • 凯撒密码编码与解码
  • 网址观察与批量生成

 

2.英文词频统计预处理

  • 下载一首英文的歌词或文章或小说。
  • 将所有大写转换为小写
  • 将所有其他做分隔符(,.?!)替换为空格
  • 分隔出一个一个的单词
  • 并统计单词出现的次数。

 

3.文件操作

  • 同一目录、绝对路径、相对路径
  • 凯撒密码:从文件读入密函,进行加密或解密,保存到文件。
  • 词频统计:下载一首英文的歌词或文章或小说,保存为utf8文件。从文件读入文本进行处理。

 

 4.函数定义

  • 加密函数
  • 解密函数
  • 读文本函数

作业详情:

1.字符串操作:

ID=input('请输入十八位身份证号码: ')

if len(ID)==18:

  print("你的身份证号码是 "+ID)

else:

  print("错误的身份证号码")

  

ID_add=ID[0:6]

ID_birth=ID[6:14]

ID_sex=ID[14:17]

ID_check=ID[17]

  

#ID_add是身份证中的区域代码,如果有一个行政区划代码字典,就可以用获取大致地址#

  

year=ID_birth[0:4]

moon=ID_birth[4:6]

day=ID_birth[6:8]

print("生日: "+year+'年'+moon+'月'+day+'日')

  

if int(ID_sex)%2==0:

  print('性别:女')

else:

  print('性别:男')

  

    

#此部分应为错误判断,如果错误就不应有上面的输出,如何实现?#

W=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]

ID_num=[18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2]

ID_CHECK=['1','0','X','9','8','7','6','5','4','3','2']

ID_aXw=0

for i in range(len(W)):

   

  ID_aXw=ID_aXw+int(ID[i])*W[i]

   

ID_Check=ID_aXw%11

if ID_check==ID_CHECK[ID_Check]:

  print('正确的身份证号码')

else:

  print('错误的身份证号码')

 

 

2.英文词频统计预处理


def getTxt():
txt = open('hamlet.txt').read()
txt = txt.lower()
for ch in '!"@#$%^&*()+,-./:;<=>?@[\\]_`~{|}': #替换特殊字符
txt.replace(ch, ' ')
return txt

hamletTxt = getTxt()


txtArr = hamletTxt.split()


counts = {}
for word in txtArr:
counts[word] = counts.get(word, 0) + 1


countsList = list(counts.items())
countsList.sort(key=lambda x:x[1], reverse=True)#按次数从大到小排序


for i in range(10):
word, count = countsList[i]
print('{0:<10}{1:>5}'.format(word,count))

 

3.凯撒密码

def change(c,i):
c = c.lower()
num = ord(c)
if num >= 97 and num <= 122:
num = 97 + ((num - 97) + i) % 26
return chr(num)


def kaisa_jiami(string,i):
string_new = ''
for s in string:
string_new += change(s,i)
print(string_new)
return string_new

def kaisa_jiemi(string):
for i in range(25):
print('\n', i, '\n')
i += 1
kaisa_jiami(string,i)


def main():
print('请选择需要的操作:')
print('1:凯撒加密')
print('2:凯撒解密')
choice = input()
if choice == '1':
string = input('请输入需要加密的字符串:')
num = int(input('请输入需要偏移的位数:'))
kaisa_jiami(string,num)
elif choice == '2':
string = input('请输入需要解密的字符串:')
kaisa_jiemi(string)
else:
print('输入错误,请重试!')
main()

if __name__ == '__main__':
main()

 

运行结果:

 

4.加密方法

def encrypt(key, s):
b = bytearray(str(s).encode("gbk"))
n = len(b) # 求出 b 的字节数
c = bytearray(n*2)
j = 0
for i in range(0, n):
b1 = b[i]
b2 = b1 ^ key # b1 = b2^ key
c1 = b2 % 16
c2 = b2 // 16 # b2 = c2*16 + c1
c1 = c1 + 65
c2 = c2 + 65 # c1,c2都是0~15之间的数,加上65就变成了A-P 的字符的编码
c[j] = c1
c[j+1] = c2
j = j+2
return c.decode("gbk")

def decrypt(key, s):
c = bytearray(str(s).encode("gbk"))
n = len(c) # 计算 b 的字节数
if n % 2 != 0 :
return ""
n = n // 2
b = bytearray(n)
j = 0
for i in range(0, n):
c1 = c[j]
c2 = c[j+1]
j = j+2
c1 = c1 - 65
c2 = c2 - 65
b2 = c2*16 + c1
b1 = b2^ key
b[i]= b1
try:
return b.decode("gbk")
except:
return "failed"

key = 30
s1 = encrypt(key, 'hello')
print(s1)

s2 = decrypt(key, s1)
print(s2)

运行结果:

GHLHCHCHBH

hello

 

 

posted @ 2019-03-11 16:37  钟金晖  阅读(266)  评论(0编辑  收藏  举报