S4 exercise -- 模块

  • 写一个用户登录验证程序,文件如下1234.json
{"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
  1. 用户名为json文件名,密码为 password。
  2. 判断是否过期,与expire_date进行对比。
  3. 登陆成功后,打印“登陆成功”,三次登陆失败,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')
View Code
  •  把三次验证的密码进行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')
View Code

 

  • 写一个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'
View Code

 

  • logging模块有几个日志级别?
 logging模块共5个级别,它们分别是:
 DEBUG INFO WARNING ERROR CRITICAL
View Code

 

  • 请配置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")
View Code

 

  • 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')
View Code

 

  • json的作用是什么?
    序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes
 传输数据
View Code

 

  • subprocess执行命令方法有几种?
有三种方法,他们分别是
 run()方法
 call()方法
 Popen()方法
View Code

 

  • 为什么要设计好目录结构?
1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。

2.可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。
View Code

 

  • 打印出命令行的第一个参数。例如:python argument.py luffy    打印出 luffy
import sys
print(sys.argv[1])
View Code

 

  • 获取文件所在目录代码如下:
'''
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
View Code

 

  • 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'
q
  1.  修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
  2. 删除 explicit_defaults_for_timestamp = true
  3.  为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'))
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
  • 利用正则表达式提取到 luffycity.com ,内容如下
<!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

 

posted @ 2018-05-15 15:24  元贞  阅读(199)  评论(0编辑  收藏  举报