- 寫(xiě)一個(gè)用戶(hù)登錄驗(yàn)證程序,文件如下1234.json
{"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
用戶(hù)名為json文件名,密碼為 password。判斷是否過(guò)期,與expire_date進(jìn)行對(duì)比。登陸成功后,打印“登陸成功”,三次登陸失敗,status值改為1,并且鎖定賬號(hào)。 1 # coding:utf-82 import json,os3 import datetime4 # data = {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}5 #6 # f = open('%s.json'%(data['id']),'w',encoding='utf-8')7 #8 # json.dump(data,f)9 # filename = '1234.json'
10 def load_data(file):
11 f = open(file)
12 data = json.load(f)
13 return data
14 def save_data(data):
15 f = open('%s.json'%data['id'],'w')
16 json.dump(data,f)
17 f.close()
18 try_count = 0
19 while True:
20 username = input('username:').strip()
21 password = input('password:').strip()
22 filename = '%s.json'%username
23 if os.path.isfile(filename):
24 data = load_data(filename)
25 expire_date = data['expire_date']
26 date_now = datetime.datetime.now()
27 if date_now > datetime.datetime.strptime(expire_date,'%Y-%m-%d'):
28 print("賬戶(hù)已過(guò)期")
29 break
30 elif data['status'] != 0:
31 print('賬戶(hù)已被鎖定')
32 break
33 elif data['password'] == password:
34 print('welcome to login'.center(20,'*'))
35 break
36 else:
37 print('wrong password')
38 try_count += 1
39 if try_count == 3:
40 data['status'] = 1
41 save_data(data)
42 break
43 else:
44 print('user not exist')
View Code - ?把三次驗(yàn)證的密碼進(jìn)行hashlib加密處理。即:json文件保存為md5的值,然后用md5的值進(jìn)行驗(yàn)證
1 # coding:utf-82 import json,os3 import datetime4 import hashlib5 6 7 data = {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}8 9
10 # f = open('%s.json'%(data['id']),'w',encoding='utf-8')
11 #
12 # json.dump(data,f)
13 # filename = '1234.json'
14 def load_data(file):
15 f = open(file)
16 data = json.load(f)
17 return data
18 def save_data(data):
19 f = open('%s.json'%data['id'],'w')
20 json.dump(data,f)
21 f.close()
22
23
24 password = bytes(data['password'],encoding='utf-8')
25 m = hashlib.md5(password).hexdigest()
26 data['password'] = m
27 save_data(data)
28
29 try_count = 0
30 while True:
31 username = input('username:').strip()
32 password = input('password:').strip()
33 filename = '%s.json'%username
34 if os.path.isfile(filename):
35 data = load_data(filename)
36 expire_date = data['expire_date']
37 date_now = datetime.datetime.now()
38 input_pwd = bytes(password,encoding='utf-8')
39 m_input_pwd = hashlib.md5(input_pwd).hexdigest()
40
41 if date_now > datetime.datetime.strptime(expire_date,'%Y-%m-%d'):
42 print("賬戶(hù)已過(guò)期")
43 break
44 elif data['status'] != 0:
45 print('賬戶(hù)已被鎖定')
46 break
47 elif data['password'] == m_input_pwd:
48 print('welcome to login'.center(20,'*'))
49 break
50 else:
51 print('wrong password')
52 try_count += 1
53 if try_count == 3:
54 data['status'] = 1
55 save_data(data)
56 break
57 else:
58 print('user not exist')
View Code - 寫(xiě)一個(gè)6位隨機(jī)驗(yàn)證碼程序(使用random模塊),要求驗(yàn)證碼中至少包含一個(gè)數(shù)字、一個(gè)小寫(xiě)字母、一個(gè)大寫(xiě)字母.
1 >>> word = random.choice(string.digits) + random.choice(string.ascii_lowercase) + random.choice(string.ascii_uppercase) + ''.join(random.sample(string.ascii_letters,3))
2 >>> word
3 '1eIigX'
View Code - logging模塊有幾個(gè)日志級(jí)別?
logging模塊共5個(gè)級(jí)別,它們分別是:DEBUG INFO WARNING ERROR CRITICAL
View Code - 請(qǐng)配置logging模塊,使其在屏幕和文件里同時(shí)打印以下格式的日志
2017-10-18 15:56:26,613 - access - ERROR - account [1234] too many login attempts
1 import logging2 3 logger = logging.getLogger('access')4 logger.setLevel(logging.DEBUG)5 ch = logging.StreamHandler()6 fl = logging.FileHandler('access.log')7 logger.addHandler(ch)8 logger.addHandler(fl)9 formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
10 ch.setFormatter(formatter)
11 fl.setFormatter(formatter)
12 logger.error("account [1234] too many login attempts")
View Code - json、pickle、shelve三個(gè)區(qū)別是什么?
首先,這三個(gè)模塊都是序列化工具。1. json是所有語(yǔ)言的序列化工具,優(yōu)點(diǎn)跨語(yǔ)言、體積小.只能序列化一些基本的數(shù)據(jù)類(lèi)型。int\str\list\tuple\dictpickle是python語(yǔ)言特有序列化工具,所有數(shù)據(jù)都能序列化。只能在python中使用,存儲(chǔ)數(shù)據(jù)占空間大.shelve模塊是一個(gè)簡(jiǎn)單的k,v將內(nèi)存數(shù)據(jù)通過(guò)文件持久化的模塊,可以持久化任何pickle可支持的python數(shù)據(jù)格式。2. 使用方式,json和pickle用法一樣,shelve是f = shelve.open('shelve_test')
View Code 序列化是指把內(nèi)存里的數(shù)據(jù)類(lèi)型轉(zhuǎn)變成字符串,以使其能存儲(chǔ)到硬盤(pán)或通過(guò)網(wǎng)絡(luò)傳輸?shù)竭h(yuǎn)程,因?yàn)橛脖P(pán)或網(wǎng)絡(luò)傳輸時(shí)只能接受bytes傳輸數(shù)據(jù)
View Code - subprocess執(zhí)行命令方法有幾種?
有三種方法,他們分別是run()方法call()方法Popen()方法
View Code - 為什么要設(shè)計(jì)好目錄結(jié)構(gòu)?
1.可讀性高: 不熟悉這個(gè)項(xiàng)目的代碼的人,一眼就能看懂目錄結(jié)構(gòu),知道程序啟動(dòng)腳本是哪個(gè),測(cè)試目錄在哪兒,配置文件在哪兒等等。從而非常快速的了解這個(gè)項(xiàng)目。2.可維護(hù)性高: 定義好組織規(guī)則后,維護(hù)者就能很明確地知道,新增的哪個(gè)文件和代碼應(yīng)該放在什么目錄之下。這個(gè)好處是,隨著時(shí)間的推移,代碼/配置的規(guī)模增加,項(xiàng)目結(jié)構(gòu)不會(huì)混亂,仍然能夠組織良好。
View Code - 打印出命令行的第一個(gè)參數(shù)。例如:python argument.py luffy ? ?打印出 luffy
import sys
print(sys.argv[1])
View Code '''
Linux當(dāng)前目錄/usr/local/nginx/html/
文件名:index.html
'''
import osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath('index.html')))print(BASE_DIR)打印的內(nèi)容是什么?
答案
/usr/local/nginx
View Code - os.path.dirname和os.path.abspath含義是什么??
os.path.dirname:指定文件的目錄
os.path.abspath:指定文件的絕對(duì)路徑
- 通過(guò)configparser模塊完成以下功能
文件名my.ini[DEFAULT][client]
port = 3306
socket = /data/mysql_3306/mysql.sock[mysqld]
explicit_defaults_for_timestamp = true
port = 3306
socket = /data/mysql_3306/mysql.sock
back_log = 80
basedir = /usr/local/mysql
tmpdir = /tmp
datadir = /data/mysql_3306
default-time-zone = '+8:00'
q ?修改時(shí)區(qū) default-time-zone = '+8:00' 為 校準(zhǔn)的全球時(shí)間 +00:00刪除 explicit_defaults_for_timestamp = true?為DEFAULT增加一條 character-set-server = utf8 import configparserconfig = configparser.ConfigParser()
config.read('my.ini')
config.set('mysqld','default-time-zone','+00:00')
config.remove_option('mysqld','explicit_defaults_for_timestamp')
config.set('DEFAULT','character-set-server','utf8')
config.write(open('my.ini','w'))
a [DEFAULT]
character-set-server = utf8[client]
port = 3306
socket = /data/mysql_3306/mysql.sock[mysqld]
port = 3306
socket = /data/mysql_3306/mysql.sock
back_log = 80
basedir = /usr/local/mysql
tmpdir = /tmp
datadir = /data/mysql_3306
default-time-zone = +00:00
o - 利用正則表達(dá)式提取到 luffycity.com ,內(nèi)容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>luffycity.com</title>
</head>
<body>
</body>
</html>
q import re
f = open('index.html','r',encoding='utf-8')
data = f.read()
print(re.findall('luffycity.com',data))
a
總結(jié)
以上是生活随笔為你收集整理的S4 exercise -- 模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。