day-17 包与模块
生活随笔
收集整理的這篇文章主要介紹了
day-17 包与模块
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
包
logging 模塊
logging 配置字典
hashlib 模塊
openpyxl 模塊
深淺拷貝
?
一 模塊
1.0.1 模塊回顧
模塊 # 三種來源1.內(nèi)置的2.第三方的3.自定義的 # 四種表示形式1.py文件(******)2.共享庫3.文件夾(一系列模塊的結(jié)合體)(******)4.C++編譯的連接到python內(nèi)置的?
1.0.2 模塊與包
# 研究模塊與包 還可以站另外兩個角度分析不同的問題 # 1.模塊的開發(fā)者 # 2.模塊的使用者# 模塊: 先產(chǎn)生一個執(zhí)行文件的名稱空間1.創(chuàng)建模塊文件的名稱空間2.執(zhí)行模塊文件中的代碼 將產(chǎn)生的名字放入模塊的名稱空間中3.在執(zhí)行文件中拿到一個指向模塊名稱空間的名字1.1 什么是包?
#官網(wǎng)解釋 Packages are a way of structuring Python’s module namespace by using “dotted module names” 包是一種通過使用'.模塊名'來組織python模塊名稱空間的方式。#具體的:它是一系列模塊文件的結(jié)合體,表示形式就是一個文件夾,該文件夾內(nèi)部通常會有一個__init__.py文件,所以其實我們創(chuàng)建包的目的就是為了用文件夾將文件/模塊組織起來, 包的本質(zhì)還是一個模塊 # from dir.dir1 import #需要強調(diào)的是: 1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包報錯 2. 創(chuàng)建包的目的不是為了運行,而是被導(dǎo)入使用,記住,包只是模塊的一種形式而已,包的本質(zhì)就是一種模塊?
?
?
1.2 為何要使用包
# 包的本質(zhì)就是一個文件夾,那么文件夾唯一的功能就是將文件組織起來,隨著功能越寫越多,我們無法將所以功能都放到一個文件中,于是我們使用模塊去組織功能,而隨著模塊越來越多,我們就需要用文件夾將模塊文件組織起來,以此來提高程序的結(jié)構(gòu)性和可維護性?
1.3 注意事項
#1.關(guān)于包相關(guān)的導(dǎo)入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什么位置,在導(dǎo)入時都必須遵循一個原則:凡是在導(dǎo)入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。但對于導(dǎo)入后,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數(shù),類(它們都可以用點的方式調(diào)用自己的屬性)。#2、import導(dǎo)入文件時,產(chǎn)生名稱空間中的名字來源于文件,import 包,產(chǎn)生的名稱空間的名字同樣來源于文件,即包下的__init__.py,導(dǎo)入包本質(zhì)就是在導(dǎo)入該文件#3、包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間?
1.4?案例示范
1 實驗一準(zhǔn)備:執(zhí)行文件為test.py,內(nèi)容#test.pyimport aaa同級目錄下創(chuàng)建目錄aaa,然后自建空__init__.py(或者干脆建包)需求:驗證導(dǎo)入包就是在導(dǎo)入包下的__init__.py解決:先執(zhí)行看結(jié)果再在__init__.py添加打印信息后,重新執(zhí)行2、實驗二準(zhǔn)備:基于上面的結(jié)果需求:aaa.xaaa.y解決:在__init__.py中定義名字x和y3、實驗三準(zhǔn)備:在aaa下建立m1.py和m2.py#m1.pydef f1():print('from 1')#m2.pydef f2():print('from 2')需求:aaa.m1 #進而aaa.m1.func1()aaa.m2 #進而aaa.m2.func2() 解決:在__init__.py中定義名字m1和m2,先定義一個普通變量,再引出如何導(dǎo)入模塊名,強調(diào):環(huán)境變量是以執(zhí)行文件為準(zhǔn)4、實驗四準(zhǔn)備:在aaa下新建包bbb需求:aaa.bbb解決:在aaa的__init__.py內(nèi)導(dǎo)入名字bbb5、實驗五準(zhǔn)備:在bbb下建立模塊m3.py#m3.pydef f3():print('from 3')需求:aaa.bbb.m3 #進而aaa.bbb.m3.f3() 解決:是bbb下的名字m3,因而要在bbb的__init__.py文件中導(dǎo)入名字m3,from aaa.bbb import m36、實驗六準(zhǔn)備:基于上面的結(jié)果需求:aaa.m1()aaa.m2()aaa.m3()進而實現(xiàn)aaa.f1()aaa.f2()aaa.f3()先用絕對導(dǎo)入,再用相對導(dǎo)入解決:在aaa的__init__.py中拿到名字m1、m2、m3包內(nèi)模塊直接的相對導(dǎo)入,強調(diào)包的本質(zhì):包內(nèi)的模塊是用來被導(dǎo)入的,而不是被執(zhí)行的用戶無法區(qū)分模塊是文件還是一個包,我們定義包是為了方便開發(fā)者維護7、實驗七將包整理當(dāng)做一個模塊,移動到別的目錄下,操作sys.path View Code?
1.5 導(dǎo)入包
# 首次導(dǎo)入包: 先產(chǎn)生一個執(zhí)行文件的名稱空間1.創(chuàng)建包下面的__init__.py文件的名稱空間2.執(zhí)行包下面的__init__.py文件中的代碼 將產(chǎn)生的名字放入包下面的__init__.py文件名稱空間中3.在執(zhí)行文件中拿到一個指向包下面的__init__.py文件名稱空間的名字在導(dǎo)入語句中 .號的左邊肯定是一個包(文件夾)# 當(dāng)你作為包的設(shè)計者來說1.當(dāng)模塊的功能特別多的情況下 應(yīng)該分文件管理2.每個模塊之間為了避免后期模塊改名的問題 你可以使用相對導(dǎo)入(包里面的文件都應(yīng)該是被導(dǎo)入的模塊)站在包的開發(fā)者 如果使用絕對路徑來管理的自己的模塊 那么它只需要永遠(yuǎn)以包的路徑為基準(zhǔn)依次導(dǎo)入模塊 站在包的使用者 你必須得將包所在的那個文件夾路徑添加到system path中(******)python2如果要導(dǎo)入包 包下面必須要有__init__.py文件 python3如果要導(dǎo)入包 包下面沒有__init__.py文件也不會報錯 當(dāng)你在刪程序不必要的文件的時候 千萬不要隨意刪除__init__.py文件""" # p.f1() # p.f2() # p.f3() # p.f4()import p1?
?
二?logging 模塊
日志模塊:記錄
import logginglogging.basicConfig(filename='access.log',format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',level=30,)logging.debug('debug日志') # 10 logging.info('info日志') # 20 logging.warning('warning日志') # 30 logging.error('error日志') # 40 logging.critical('critical日志') # 50?
問題
# 1.亂碼 # 2.日志格式 # 3.如何既打印到終端又寫到文件中日志分為五個等級 ? 等級:地震的強度
# 1.logger對象:負(fù)責(zé)產(chǎn)生日志 # 2.filter對象:過濾日志(了解) # 3.handler對象:控制日志輸出的位置(文件/終端) # 4.formmater對象:規(guī)定日志內(nèi)容的格式?
hfajks
import logging# 1.logger對象:負(fù)責(zé)產(chǎn)生日志 logger = logging.getLogger('轉(zhuǎn)賬記錄') # 2.filter對象:過濾日志(了解)# 3.handler對象:控制日志輸出的位置(文件/終端) hd1 = logging.FileHandler('a1.log',encoding='utf-8') # 輸出到文件中 hd2 = logging.FileHandler('a2.log',encoding='utf-8') # 輸出到文件中 hd3 = logging.StreamHandler() # 輸出到終端# 4.formmater對象:規(guī)定日志內(nèi)容的格式 fm1 = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p', ) fm2 = logging.Formatter(fmt='%(asctime)s - %(name)s: %(message)s',datefmt='%Y-%m-%d', )# 5.給logger對象綁定handler對象 logger.addHandler(hd1) logger.addHandler(hd2) logger.addHandler(hd3)# 6.給handler綁定formmate對象 hd1.setFormatter(fm1) hd2.setFormatter(fm2) hd3.setFormatter(fm1)# 7.設(shè)置日志等級 logger.setLevel(20)# 8.記錄日志 logger.debug('寫了半天 好累啊 好熱啊 好想釋放')?
logging配置字典
?
import os import logging.config# 定義三種日志輸出格式 開始 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \'[%(levelname)s][%(message)s]' #其中name為getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'# 定義日志輸出格式 結(jié)束 """ 下面的兩個變量對應(yīng)的值 需要你手動修改 """ logfile_dir = os.path.dirname(__file__) # log文件的目錄 logfile_name = 'a3.log' # log文件名# 如果不存在定義的日志目錄就創(chuàng)建一個 if not os.path.isdir(logfile_dir):os.mkdir(logfile_dir)# log文件的全路徑 logfile_path = os.path.join(logfile_dir, logfile_name) # log配置字典 LOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': standard_format},'simple': {'format': simple_format},},'filters': {}, # 過濾日志'handlers': {#打印到終端的日志'console': {'level': 'DEBUG','class': 'logging.StreamHandler', # 打印到屏幕'formatter': 'simple'},#打印到文件的日志,收集info及以上的日志'default': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler', # 保存到文件'formatter': 'standard','filename': logfile_path, # 日志文件'maxBytes': 1024*1024*5, # 日志大小 5M'backupCount': 5,'encoding': 'utf-8', # 日志文件的編碼,再也不用擔(dān)心中文log亂碼了 },},'loggers': {#logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['default', 'console'], # 這里把上面定義的兩個handler都加上,即log數(shù)據(jù)既寫入文件又打印到屏幕'level': 'DEBUG','propagate': True, # 向上(更高level的logger)傳遞}, # 當(dāng)鍵不存在的情況下 默認(rèn)都會使用該k:v配置 }, }# 使用日志字典配置 logging.config.dictConfig(LOGGING_DIC) # 自動加載字典中的配置 logger1 = logging.getLogger('asajdjdskaj') logger1.debug('好好的 不要浮躁 努力就有收獲') View Code?hashlib模塊
hashlib模塊 加密的模塊 import hashlib # 這個加密的過程是無法解密的 md = hashlib.sha3_256() # 生成一個幫你造密文的對象 # md.update('hello'.encode('utf-8')) # 往對象里傳明文數(shù)據(jù) update只能接受bytes類型的數(shù)據(jù) md.update(b'Jason_@.') # 往對象里傳明文數(shù)據(jù) update只能接受bytes類型的數(shù)據(jù) print(md.hexdigest()) # 獲取明文數(shù)據(jù)對應(yīng)的密文撞庫
1.不用的算法 使用方法是相同的 密文的長度越長 內(nèi)部對應(yīng)的算法越復(fù)雜 但是1.時間消耗越長2.占用空間更大 通常情況下使用md5算法 就可以足夠了?
dffh
import hashlib # 傳入的內(nèi)容 可以分多次傳入 只要傳入的內(nèi)容相同 那么生成的密文肯定相同 md = hashlib.md5() md.update(b'areyouok?') md.update(b'are') md.update(b'you') md.update(b'ok?') print(md.hexdigest()) # 408ac8c66b1e988ee8e2862edea06cc7 408ac8c66b1e988ee8e2862edea06cc7hashlib模塊應(yīng)用場景
1.密碼的密文存儲
2.校驗文件內(nèi)容是否一致
?
加鹽處理
import hashlibmd = hashlib.md5() # 公司自己在每一個需要加密的數(shù)據(jù)之前 先手動添加一些內(nèi)容 md.update(b'oldboy.com') # 加鹽處理 md.update(b'hello') # 真正的內(nèi)容 print(md.hexdigest())動態(tài)加鹽
import hashlibdef get_md5(data):md = hashlib.md5()md.update('加鹽'.encode('utf-8'))md.update(data.encode('utf-8'))return md.hexdigest()password = input('password>>>:') res = get_md5(password) print(res)?
?
?
openpyxl模塊
openpyxl 簡介
# openpyxl 比較火的操作excel表格的模塊 03版本之前 excel文件的后綴名 叫xls 03版本之后 excel文件的后綴名 叫xlsxxlwd 寫excel xlrt 讀excelxlwd和xlrt既支持03版本之前的excel文件也支持03版本之后的excel文件 openpyxl 只支持03版本之后的 xlsx?
寫
from openpyxl import Workbookwb = Workbook() # 先生成一個工作簿 wb1 = wb.create_sheet('index',0) # 創(chuàng)建一個表單頁 后面可以通過數(shù)字控制位置 wb2 = wb.create_sheet('index1') wb1.title = 'login' # 后期可以通過表單頁對象點title修改表單頁名稱 wb1['A3'] = 666 wb1['A4'] = 444 wb1.cell(row=6,column=3,value=88888888) wb1['A5'] = '=sum(A3:A4)'wb2['G6'] = 999 wb1.append(['username','age','hobby']) wb1.append(['jason',18,'study']) wb1.append(['tank',72,'吃生蠔']) wb1.append(['egon',84,'女教練']) wb1.append(['sean',23,'會所']) wb1.append(['nick',28,]) wb1.append(['nick','','禿頭'])保存新建的excel文件 wb.save('test.xlsx')?
sdj
from openpyxl import load_workbook # 讀文件 wb = load_workbook('test.xlsx',read_only=True,data_only=True) # print(wb) # print(wb.sheetnames) # ['login', 'Sheet', 'index1'] # print(wb['login']['A3'].value) # print(wb['login']['A4'].value) # print(wb['login']['A5'].value) # 通過代碼產(chǎn)生的excel表格必須經(jīng)過人為操作之后才能讀取出函數(shù)計算出來的結(jié)果值 res = wb['login'] # print(res) ge1 = res.rows for i in ge1:for j in i:print(j.value)?
?
深淺拷貝
淺拷貝
?
深拷貝
?
應(yīng)用
import copyl = [1,2,[1,2]] # l1 = l # print(id(l),id(l1)) # l1 = copy.copy(l) # 拷貝一份 ....... 淺拷貝 # print(id(l),id(l1)) # # l[0] = 222 # # print(l,l1) # l[2].append(666) # print(l,l1) l1 = copy.deepcopy(l) l[2].append(666) print(l,l1)?
?
?
?
?
asdf
adff
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ryan-Yuan/p/11222236.html
總結(jié)
以上是生活随笔為你收集整理的day-17 包与模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H5唤醒app,不完全兼容
- 下一篇: 64位系统下,一个32位的程序究竟可以申