S4 exercise -- 模块
- 写一个用户登录验证程序,文件如下1234.json
{"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
- 用户名为json文件名,密码为 password。
- 判断是否过期,与expire_date进行对比。
- 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
1 # coding:utf-8 2 import json,os 3 import datetime 4 # 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("账户已过期") 29 break 30 elif data['status'] != 0: 31 print('账户已被锁定') 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')
- 把三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证
1 # coding:utf-8 2 import json,os 3 import datetime 4 import hashlib 5 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("账户已过期") 43 break 44 elif data['status'] != 0: 45 print('账户已被锁定') 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')
- 写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
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'
- logging模块有几个日志级别?
logging模块共5个级别,它们分别是:
DEBUG INFO WARNING ERROR CRITICAL
- 请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志
2017-10-18 15:56:26,613 - access - ERROR - account [1234] too many login attempts
1 import logging 2 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")
- json、pickle、shelve三个区别是什么?
首先,这三个模块都是序列化工具。 1. json是所有语言的序列化工具,优点跨语言、体积小.只能序列化一些基本的数据类型。int\str\list\tuple\dict pickle是python语言特有序列化工具,所有数据都能序列化。只能在python中使用,存储数据占空间大. shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。 2. 使用方式,json和pickle用法一样,shelve是f = shelve.open('shelve_test')
- json的作用是什么?
序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes
传输数据
- subprocess执行命令方法有几种?
有三种方法,他们分别是
run()方法
call()方法
Popen()方法
- 为什么要设计好目录结构?
1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。
2.可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。
- 打印出命令行的第一个参数。例如:python argument.py luffy 打印出 luffy
import sys print(sys.argv[1])
- 获取文件所在目录代码如下:
''' Linux当前目录/usr/local/nginx/html/ 文件名:index.html ''' import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath('index.html'))) print(BASE_DIR) 打印的内容是什么? 答案 /usr/local/nginx
- os.path.dirname和os.path.abspath含义是什么?
os.path.dirname:指定文件的目录
os.path.abspath:指定文件的绝对路径
- 通过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'
- 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
- 删除 explicit_defaults_for_timestamp = true
- 为DEFAULT增加一条 character-set-server = utf8
import configparser config = 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'))
[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
- 利用正则表达式提取到 luffycity.com ,内容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>luffycity.com</title> </head> <body> </body> </html>
import re f = open('index.html','r',encoding='utf-8') data = f.read() print(re.findall('luffycity.com',data))