第四章練習題

                              第四章練習題

一、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 對象
logger = logging.getLogger('access')
logger.setLevel(logging.DEBUG)

#二、生成 handler 對象
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)        #設置輸出屏幕級別
fh = logging.FileHandler('access.log')   #生成文件
fh.setLevel(logging.ERROR)     #設置輸出文件級別

#2.一、把 handler 對象 綁定到 logger
logger.addHandler(ch)
logger.addHandler(fh)

#三、生成 formatter 對象
#3.一、把 formatter 對象 綁定到 handler
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(message)s')

ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter)

#進行打印日誌
logger.error("account [1234] too many login attempts")

 

三、json、pickle、shelve三個區別是什麼?

首先,json、pickle、shelve 都是序列化工具;
1.json模塊,用於字符串 和 python數據類型間進行轉換(提供了四個功能:dumps、dump、loads、load)
     優勢:跨語言、體積小
     缺點:只能支持int\str\list\tuple\dict
2.pickle模塊,用於python特有的類型 和 python的數據類型間進行轉換(提供了四個功能:dumps、dump、loads、load)
     優勢:專爲python設計,支持python全部的數據類型 
     缺點:只能在python中使用,存儲數據佔空間大
3.shelve模塊是一個簡單的k,v將內存數據經過文件持久化的模塊,能夠持久化任何pickle可支持的python數據格式。
使用方式:
json和pickle用法相同:
import pickle
data = {'k1':123,'k2':'Hello'}
# pickle.dumps 將數據經過特殊的形式轉換位只有python語言認識的字符串
p_str = pickle.dumps(data)
print(p_str)

import json
# json.dumps 將數據經過特殊的形式轉換位全部程序語言都認識的字符串
j_str = json.dumps(data)
print(j_str)

shelve是f = shelve.open('shelve_test')

 

四、json的做用是什麼?

序列化是指把內存裏的數據類型轉變成字符串,以使其能存儲到硬盤或經過網絡傳輸到遠程,由於硬盤或網絡傳輸時只能接受bytes。

 

五、subprocess執行命令方法有幾種?

三種執行命令的方法:
1.subprocess.run(*popenargs, input=None, timeout=None, check=False, **kwargs) #官方推薦
2.subprocess.call(*popenargs, timeout=None, **kwargs) #跟上面實現的內容差很少,另外一種寫法
3.subprocess.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)

1.打印的內容是:

/usr/local/nginx

2.os.path.dirname和os.path.abspath含義是什麼?

獲取路徑名:os.path.dirname()
得到絕對路徑: os.path.abspath() 

 

九、經過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'

1.修改時區 default-time-zone = '+8:00' 爲 校準的全球時間 +00:00

import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.set('mysqld','default-time-zone','+00:00')
config.write(open('my.cnf', "w"))
print(config['mysqld']['default-time-zone'] )

 

2.刪除 explicit_defaults_for_timestamp = true

import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.remove_option('mysqld','explicit_defaults_for_timestamp')
config.write(open('my.cnf', "w"))

 

3.爲DEFAULT增長一條 character-set-server = utf8

import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.set('DEFAULT','character-set-server','utf8')
config.write(open('my.cnf', "w"))

 

十、寫一個6位隨機驗證碼程序(使用random模塊),要求驗證碼中至少包含一個數字、一個小寫字母、一個大寫字母。

import random
import string
a = ''.join(random.sample(string.ascii_lowercase + string.ascii_uppercase + string.digits,6))
print(a)

 

十一、利用正則表達式提取到 luffycity.com ,內容以下:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>luffycity.com</title>
</head>
<body>
</body>
</html>
import re
f = open('index.html','r',encoding='utf-8')
data = f.read()
print(re.findall('luffycity.com',data))

 

十二、寫一個用戶登陸驗證程序,文件以下:

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,而且鎖定帳號。

import json
import time
username = input(‘請輸入用戶名(文件名):‘)
f = open(‘1234.json‘,‘r‘,encoding=‘utf-8‘)
data = f.read()
data1 = json.loads(data)
#print(data1[‘password‘])
count = 0
while count < 3:
    if (int(time.strftime(‘%Y‘)))-(int(data1["expire_date"][0:4])) > 0:
        print(‘您的帳戶已過時‘)
        exit()
    if data1[‘status‘] == 1:
        print(‘您的帳戶已被鎖定,沒法登陸‘)
        exit()
    password = input(‘請輸入密碼:‘)
    if password == data1[‘password‘]:
        print(‘登陸成功‘)

    elif count == 2:
        data1[‘status‘] = 1
        f1 = open(‘1234.json‘,‘w‘,encoding=‘utf-8‘)
        json.dump(data1,f1)  #修改json數據
        print(‘您的帳戶已被鎖定‘)
        exit()
    else:
        print(‘您的密碼有誤,請從新輸入‘)
    count += 1

 

 1三、把第12題三次驗證的密碼進行hashlib加密處理。即:json文件保存爲md5的值,而後用md5的值進行驗證。

password = input(‘請輸入密碼:‘)
    m = hashlib.md5()
    m.update(password.encode())
    if m.hexdigest() == data1[‘password‘]:
        print(‘登陸成功‘)
相關文章
相關標籤/搜索