S4 exercise -- 模块
- 写一个用户登录验证程序,文件如下1234.json
{"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
- 用户名为json文件名,密码为 password。
- 判断是否过期,与expire_date进行对比。
- 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
# coding:utf-8
import json,os
import datetime
# data = {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
#
# f = open('%s.json'%(data['id']),'w',encoding='utf-8')
#
# json.dump(data,f)
# filename = '1234.json'
def load_data(file):
f = open(file)
data = json.load(f)
return data
def save_data(data):
f = open('%s.json'%data['id'],'w')
json.dump(data,f)
f.close()
try_count = 0
while True:
username = input('username:').strip()
password = input('password:').strip()
filename = '%s.json'%username
if os.path.isfile(filename):
data = load_data(filename)
expire_date = data['expire_date']
date_now = datetime.datetime.now()
if date_now > datetime.datetime.strptime(expire_date,'%Y-%m-%d'):
print("账户已过期")
break
elif data['status'] != 0:
print('账户已被锁定')
break
elif data['password'] == password:
print('welcome to login'.center(20,'*'))
break
else:
print('wrong password')
try_count += 1
if try_count == 3:
data['status'] = 1
save_data(data)
break
else:
print('user not exist')
- 把三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证
# coding:utf-8
import json,os
import datetime
import hashlib data = {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"} # f = open('%s.json'%(data['id']),'w',encoding='utf-8')
#
# json.dump(data,f)
# filename = '1234.json'
def load_data(file):
f = open(file)
data = json.load(f)
return data
def save_data(data):
f = open('%s.json'%data['id'],'w')
json.dump(data,f)
f.close() password = bytes(data['password'],encoding='utf-8')
m = hashlib.md5(password).hexdigest()
data['password'] = m
save_data(data) try_count = 0
while True:
username = input('username:').strip()
password = input('password:').strip()
filename = '%s.json'%username
if os.path.isfile(filename):
data = load_data(filename)
expire_date = data['expire_date']
date_now = datetime.datetime.now()
input_pwd = bytes(password,encoding='utf-8')
m_input_pwd = hashlib.md5(input_pwd).hexdigest() if date_now > datetime.datetime.strptime(expire_date,'%Y-%m-%d'):
print("账户已过期")
break
elif data['status'] != 0:
print('账户已被锁定')
break
elif data['password'] == m_input_pwd:
print('welcome to login'.center(20,'*'))
break
else:
print('wrong password')
try_count += 1
if try_count == 3:
data['status'] = 1
save_data(data)
break
else:
print('user not exist')
- 写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
>>> word = random.choice(string.digits) + random.choice(string.ascii_lowercase) + random.choice(string.ascii_uppercase) + ''.join(random.sample(string.ascii_letters,3))
>>> word
'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
import logging
logger = logging.getLogger('access')
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
fl = logging.FileHandler('access.log')
logger.addHandler(ch)
logger.addHandler(fl)
formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
ch.setFormatter(formatter)
fl.setFormatter(formatter)
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'
q
- 修改时区 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'))
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
S4 exercise -- 模块的更多相关文章
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- 【Python基础】lpthw - Exercise 40 模块、类和对象
一. 模块(module) 模块中包含一些函数和变量,在其他程序中使用该模块的内容时,需要先将模块import进去,再使用.操作符获取函数或变量,如 # This goes in mystuff.py ...
- python基础-模块
一.模块介绍 ...
- Unity加载模块深度解析(纹理篇)
在游戏和VR项目的研发过程中,加载模块所带来的效率开销和内存占用(即“加载效率”.“场景切换速度”等)经常是开发团队非常头疼的问题,它不仅包括资源的加载耗时,同时也包含场景物件的实例化和资源卸载等.在 ...
- oop、configparser、xml模块
本节大纲:一:在python中,有两种编程思想.1:函数式编程.2:oop.无论是函数式编程还是oop都是相辅相成.并不是说oop比函数式编程就好.各有各的优缺点.在其他语言中java等只能以面向对象 ...
- Web应用程序系统的多用户权限控制设计及实现-栏目模块【8】
前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的基本模块-栏目模块.栏目模块涉及到的数据表为目录表. 1.1栏目域 为了更规范和方便后期系统的二次开发和维护 ...
- Mininet实验 使用l2_multi模块寻找最短路径实验
参考:使用l2_multi模块寻找最短路径实验 1. 实验目的 1.认识VND并且掌握其基本使用方法. 2.学会使用pox控制器的l2_multi模块寻找主机间的最短传输路径. 2. 实验原理 VND ...
- Python开发【第一篇】Python基础之自定义模块和内置模块
为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...
- Python标准库之os模块
1.删除和重命名文件 import os import string def replace(file, search_for, replace_with): # replace strings in ...
随机推荐
- kafka offset 设置
from kafka import KafkaConsumer from kafka import TopicPartition from kafka.structs import OffsetAnd ...
- int和Integer区别
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper cl ...
- 数据报表之Excel操作模块
Excel是当今最流行的电子表格处理软件,支持丰富的计算函数及图表,在系统运营方面广泛用于运营数据报表,比如业务质量.资源利用.安全扫描等报表,同时也是应用系统常见的文件导出格式,以便数据使用人员做进 ...
- NUMA体系结构介绍
为什么会有NUMA? 在NUMA架构出现前,CPU欢快的朝着频率越来越高的方向发展.受到物理极限的挑战,又转为核数越来越多的方向发展.如果每个core的工作性质都是share-nothing(类似于m ...
- cobbler配置解析
1.Cobbler命令说明: 命令名称 命令用途 cobbler check 检查cobbler配置 cobbler list 列出所有的cobbler元素 cobbler report 列出元素的详 ...
- How to Pronounce INTERNATIONAL
How to Pronounce INTERNATIONAL Share Tweet Share Tagged With: Dropped T How do you pronounce this lo ...
- 【Java】JVM(六)虚拟机字节码执行引擎
一.概述 执行引擎是虚拟机中最核心的部分之一, 虚拟机自己实现引擎,自己定义指令集和执行引擎的结构体系. 二.栈帧 栈帧包含(1)局部变量表.(2)操作数栈.(3)动态链接.(4)方法返回地址.(5) ...
- 用NBU无法还原数据库到ASM磁盘
描述:用NBU无法还原数据库到ASM磁盘,却可以还原到数据库本地磁盘 错误提示: ORA-15025: could not open disk "/dev/mapper/DATA1" ...
- java学习笔记----@Override的作用
初学java或多或少都会有这样的疑问,@Override有什么用,有的时候写,有的时候又不写,搞的初学者甚是郁闷. 做了一两年的开发说起这个问题不一定能够对答如流.小弟才疏学浅,花了点时间,看了一下资 ...
- css3自定义placeholder字体颜色
::-webkit-input-placeholder{color:#f00;} ::-moz-placeholder{color:#f00;} :-moz-placeholder{color:#f0 ...