• 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是所有语言的序列化工具,优点跨语言、体积小.只能序列化一些基本的数据类型。intstrlist	upledict
     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
  • 相关阅读:
    Angularjs乱记
    tornado code
    angularjs中templateUrl的路径问题
    bat脚本禁用和开启本地连接
    http-server使用
    angularjs loading, animate
    tornado输出json
    cmder切换路径、设置命令别名
    python __setattr__和__getattr__
    滚动加载
  • 原文地址:https://www.cnblogs.com/wenyule/p/9041159.html
Copyright © 2020-2023  润新知