字符串、文件操作,英文词率统计预处理
该作业要求来于: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