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 ...
随机推荐
- UI5-文档-4.22-Expression Binding
有时预定义的SAPUI5类型不够灵活,您希望在视图中执行简单的计算或格式化——这正是表达式真正有用的地方.我们使用它们根据数据模型中的当前数字格式化价格. Preview The price is n ...
- TCP/IP知识总结(TCP/IP协议族读书笔记三)
接下来,总结传输层的两大协议UDP和TCP. 一.UDP(用户数据报协议) 讲UDP之间,先了解两个概念:有连接和无连接. 有连接:通信之前,通信双方必须建立一条通道: 无连接:不需要建立通道,发送方 ...
- [转载]百分之百自动登录2345王牌技术员联盟源代码(delphi)
资源地址:http://download.csdn.net/detail/softlib/9670613
- mysql 建库建表建用户
1.创建数据库 create database school; 2.使用数据库 Use school; 3.创建用户 create user jame@localhost identified by ...
- ASP.NETAutocomplete control
分享一个Ajax autocomplete control, 原文链接:http://forums.asp.net/t/1157595.aspx 首先,引入ScriptManager <asp: ...
- MongoDB 数据查询
数据查询 基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty(): ...
- Ubuntu下面网络固定ip
https://jingyan.baidu.com/article/e5c39bf5bbe0e739d7603396.html
- form 表单排序
<html> <head></head> <body> <form class="form-inline"> ...
- R画散点图、线型图、箱型图、直方图基本知识
1.导入数据 2.散点图 plot(iris[,1]~iris[,4],xlab='Length',ylab='Width',col='red',main='Length VS Width')
- Xpath同时选取不同属性的元素
如:一个论坛中,有置顶贴和普通贴,它们使用了不同的class,但这两类帖子都是需要的内容,需要同时爬下来 假设置顶贴class="top",普通贴class="commo ...