模块学习相关练习题
1.logging模块有几个日志级别?
loggging模块有5个日志级别,分别是 DEBUG, INFO, WARNING, ERROR, CRITICAL
2. 请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志
2017-10-18 15:56:26,613 - access - ERROR - account [1234] too many login attempts
代码如下:
import logging
logger = logging.getLogger("access")
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler("access.log")
logger.addHandler(console_handler)
logger.addHandler(file_handler)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s [%(lineno)d] %(message)s")
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
logger.error("too many login attempts")
3. json、pickle、shelve三个区别是什么?
json 跨语言,体积小
pickle只支持python,体积大
shelve是封装的pickle,只支持python,体积大,支持k, v 的数据结构
4. json的作用是什么?
将内存数据转换为规则的json数据,序列化到硬盘,以供程序之后使用或提供给其他服务使用。
5. subprocess执行命令方法有几种?
run()
call()
Popen()
6. 为什么要设计好目录结构?
好的目录结构能够更清晰的组织程序结构,使程序更可读,和更可维护。
7. 打印出命令行的第一个参数。例如:
python argument.py luffy
打印出 luffy
import sys
print(sys.argv[1])
8. 代码如下:
'''
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)
1). 打印的内容是什么?
/usr/local/nginx
2). os.path.dirname和os.path.abspath含义是什么?
os.path.dirname :只有目录
os.path.abspath:包括目录和文件名,即绝对路径
9. 通过configparser模块完成以下功能
文件名my.cnf
[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_file = "my.cnf"
config = configparser.ConfigParser()
config.read(config_file)
# 1. 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
config.set("mysqld", "default-time-zone", "'+00:00'")
# 2. 删除 explicit_defaults_for_timestamp = true
config.remove_option("mysqld", "explicit_defaults_for_timestamp")
# 3. 为DEFAULT增加一条 character-set-server = utf8
config.set("DEFAULT", "character-set-server", "'utf8'")
# 将修改写回到文件
config.write(open(config_file, "w", encoding="utf-8"))
运行后最终文件如下:
[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'
10. 写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
import random
import string
s = "".join(random.sample(string.digits + string.ascii_lowercase + string.ascii_uppercase, 6))
print(s)
11. 利用正则表达式提取到 luffycity.com ,内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>luffycity.com</title>
</head>
<body>
</body>
</html>
代码:
f = open("re.txt", "r", encoding="utf-8") data = f.read() s = re.findall("luffycity.com", data) f.close()
12. 写一个用户登录验证程序,文件如下
1234.json
{"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
- 用户名为json文件名,密码为 password。
- 判断是否过期,与expire_date进行对比。
- 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
代码:
import json
import time
file_name = "1234.json"
with open(file_name, "r", encoding="utf-8") as f:
d = json.load(f)
print(d)
def write_back_to_json():
with open(file_name, "w", encoding="utf-8") as f:
json.dump(d, f)
n = 0
while n < 3:
user = input("username:")
pwd = input("password:")
if user == file_name.split(".")[0] and pwd == d["password"]:
# 判断账户是否锁定
if d["status"] == 0:
# 判断是否过期
dt = time.strftime("%Y-%m-%d")
if dt < d["expire_date"]:
print("登录成功")
break
else:
print("账户已过期。")
d["status"] = 1
write_back_to_json()
break
else:
print("账户已锁定,请联系管理员解锁。")
break
else:
print("用户名或密码错误。")
n += 1
if n == 3:
print("你已登录失败3次,账户锁定")
d["status"] = 1
write_back_to_json()
13. 把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。
import json
import time
import hashlib
file_name = "1234.json"
with open(file_name, "r", encoding="utf-8") as f:
d = json.load(f)
print(d)
def write_back_to_json():
with open(file_name, "w", encoding="utf-8") as f:
json.dump(d, f)
n = 0
while n < 3:
user = input("username:")
pwd = input("password:")
hash = hashlib.md5()
hash.update(bytes(pwd, encoding='utf-8'))
pwd = hash.hexdigest()
if user == file_name.split(".")[0] and pwd == d["password"]:
# 判断账户是否锁定
if d["status"] == 0:
# 判断是否过期
dt = time.strftime("%Y-%m-%d")
if dt < d["expire_date"]:
print("登录成功")
break
else:
print("账户已过期。")
d["status"] = 1
write_back_to_json()
break
else:
print("账户已锁定,请联系管理员解锁。")
break
else:
print("用户名或密码错误。")
n += 1
if n == 3:
print("你已登录失败3次,账户锁定")
d["status"] = 1
write_back_to_json()
14. 最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。
需求如下:
- 目录结构为
.
├── account
│ ├── luffy.json
│ └── tesla.json
└── bin
└── start.py
当执行start.py时,出现交互窗口
------- Luffy Bank ---------
1. 账户信息
2. 转账
- 选择1 账户信息 显示luffy的当前账户余额。
- 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万
代码如下:
luffy.json
{
"line_of_credit": 2000000,
"balance": 2000000
}
tesla.json
{
"line_of_credit": 2000000,
"balance": 2000000
}
start.py
import json
luffy_file_name = "../account/luffy.json"
tesla_file_name = "../account/tesla.json"
with open(luffy_file_name, "r", encoding="utf-8") as f:
luffy_dict = json.load(f)
with open(tesla_file_name, "r", encoding="utf-8") as f:
tesla_dict = json.load(f)
def write_luffy_back():
with open(luffy_file_name, "w", encoding="utf-8") as f:
json.dump(luffy_dict, f)
def write_tesla_back():
with open(tesla_file_name, "w", encoding="utf-8") as f:
json.dump(tesla_dict, f)
while True:
msg = '''
------- Luffy Bank ---------
1. 账户信息
2. 转账
'''
print(msg)
choice = input("choice: ").strip()
if choice.isdigit():
choice = int(choice)
if choice == 1:
print("你的余额:%s 元" % (luffy_dict["balance"]))
if choice == 2:
pri = 750000
if luffy_dict["balance"] < pri:
print("账户上只有:%s 元,转不了" % (luffy_dict["balance"]))
else:
interest = pri * 5 / 100
luffy_dict["balance"] = luffy_dict["balance"] - pri - interest
tesla_dict["balance"] = tesla_dict["balance"] + pri
write_luffy_back()
write_tesla_back()
print("转账 %s 元到 tesla 成功, 并扣除利息 %s 元, 你还有余额 %s 元" % (pri, interest, luffy_dict["balance"]))
else:
print("没有你输入的选项")
运行效果:
——- Luffy Bank ———
1. 账户信息
2. 转账
choice: 1
你的余额:2000000 元
——- Luffy Bank ———
1. 账户信息
2. 转账
choice: 2
转账 750000 元到 tesla 成功, 并扣除利息 37500.0 元, 你还有余额 1212500.0 元
——- Luffy Bank ———
1. 账户信息
2. 转账
choice:
15. 对上题增加一个需求:提现。
目录结构如下
.
├── account
│ └── luffy.json
├── bin
│ └── start.py
└── core
└── withdraw.py
当执行start.py时,出现交互窗口
------- Luffy Bank ---------
1. 账户信息
2. 提现
- 选择1 账户信息 显示luffy的当前账户余额和信用额度。
- 选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。
代码如下:
16. 尝试把上一章的验证用户登陆的装饰器添加到提现和转账的功能上。
17. 对第15题的用户转账、登录、提现操作均通过logging模块记录日志,日志文件位置如下
.
├── account
│ └── luffy.json
├── bin
│ └── start.py
└── core
| └── withdraw.py
└── logs
└── bank.log
共有 0 条评论