- 写一个用户登录验证程序,文件如下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 data14 def save_data(data):15 f = open('%s.json'%data['id'],'w')16 json.dump(data,f)17 f.close()18 try_count = 019 while True:20 username = input('username:').strip()21 password = input('password:').strip()22 filename = '%s.json'%username23 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 break30 elif data['status'] != 0:31 print('账户已被锁定')32 break33 elif data['password'] == password:34 print('welcome to login'.center(20,'*'))35 break36 else:37 print('wrong password')38 try_count += 139 if try_count == 3:40 data['status'] = 141 save_data(data)42 break43 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 data18 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'] = m27 save_data(data)28 29 try_count = 030 while True:31 username = input('username:').strip()32 password = input('password:').strip()33 filename = '%s.json'%username34 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 break44 elif data['status'] != 0:45 print('账户已被锁定')46 break47 elif data['password'] == m_input_pwd:48 print('welcome to login'.center(20,'*'))49 break50 else:51 print('wrong password')52 try_count += 153 if try_count == 3:54 data['status'] = 155 save_data(data)56 break57 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 >>> word3 '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 sysprint(sys.argv[1])
- 获取文件所在目录代码如下:
'''Linux当前目录/usr/local/nginx/html/文件名:index.html'''import osBASE_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 = 3306socket = /data/mysql_3306/mysql.sock[mysqld]explicit_defaults_for_timestamp = trueport = 3306socket = /data/mysql_3306/mysql.sockback_log = 80basedir = /usr/local/mysqltmpdir = /tmpdatadir = /data/mysql_3306default-time-zone = '+8:00'
- 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +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'))
[DEFAULT]character-set-server = utf8[client]port = 3306socket = /data/mysql_3306/mysql.sock[mysqld]port = 3306socket = /data/mysql_3306/mysql.sockback_log = 80basedir = /usr/local/mysqltmpdir = /tmpdatadir = /data/mysql_3306default-time-zone = +00:00
- 利用正则表达式提取到 luffycity.com ,内容如下
luffycity.com
import ref = open('index.html','r',encoding='utf-8')data = f.read()print(re.findall('luffycity.com',data))