[Python3]模块练习

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
logging.basicConfig(format='%(asctime)s,%(relativeCreated)d - %(thread)d - %(levelname)s -'
                           ' %(message)s', datefmt='%Y-%m-%d %I:%M:%S')
logging.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执行命令方法有几种?
3种 
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:指定文件的绝对路径

写一个用户登录验证程序,文件如下 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 os
import time

lockdict = {}       # 用于保存多用户登录错误次数标记
while True:
    user = input('username:')

    if os.path.isfile('{}.json'.format(user)):      # 判断文件是否存在,文件存在即用户存在
        f = open('{}.json'.format(user), 'r+')
        data = json.load(f)
        if data['status'] == 0:             # 判断取出的数据里status状态是否是锁定状态,0为未锁定
            pw = input('password:')

            if pw == data['password']:          # 判断用户对应密码
                tm = time.mktime(time.strptime(data['expire_date'], '%Y-%m-%d'))
                if time.time() < tm:        # 判断账号是否过期
                    print('登陆成功', data['id'])
                    break
                else:
                    print('您的账户已过期')
            else:
                print('密码错误请重新输入')
                if lockdict.get(data['id']) is None:        # 判断lockdict 不存在用户则添加
                    lockdict[data['id']] = 1
                else:
                    lockdict[data['id']] += 1
                    if lockdict[data['id']] == 3:       # 如果lockdict 用户名对应值 等于3 则锁定用户
                        data['status'] = 1
                        with open('{}.json'.format(user), 'w') as fp:
                            json.dump(data, fp)
                        print('您的账户已锁定')
        else:
            print('您的账户已锁定,请联系管理员')
    else:
        print('没有此用户,请重新输入')


a = '130283199909225652'
s = re.search('(?P\d{3})(?P\d{3})(?P\d{4})', a)
# print(re.search('([a-z]+)([0-9]+)', a).groups())
print(s.groupdict())


写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
import string
import random
a = ''.join(random.sample(string.ascii_lowercase + string.ascii_uppercase + string.digits, 6))
print(a)


通过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 = configparser.ConfigParser()
config.read('my.cnf')

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.cnf', 'w'))

利用正则表达式提取到 luffycity.com ,内容如下





luffycity.com



你可能感兴趣的:(Python)