您好,登錄后才能下訂單哦!
這篇文章主要介紹了python模塊怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
模塊是一系列功能的集合體 常見的模塊形式(自定義模塊、第三方模塊、內(nèi)置模塊): 1、一個(gè)module.py文件就是一個(gè)模塊,文件名是module.py,而模塊名是module 2、一個(gè)包含有__init__.py文件的文件夾也是模塊 3、已被編譯為共享庫或DLL的C或C++擴(kuò)展 4、使用C編寫并鏈接到python解釋器的內(nèi)置模塊
1、用第三方或者內(nèi)置的模塊是一種拿來主義,可以極大地提升開發(fā)效率 2、自定義模塊即將我們自己程序中需要用到的公共的功能寫入一個(gè)python文件 然后程序的各部分組件可以通過導(dǎo)入的方式來引用/重用自定義模塊中的功能
大前提:模塊是被執(zhí)行文件導(dǎo)入使用,模塊的導(dǎo)入必須搞明白誰是執(zhí)行文件,誰是被導(dǎo)入的模塊 import 首次import m1導(dǎo)入模塊都發(fā)生三件事: 1、先創(chuàng)建一個(gè)模塊的名稱空間 2、執(zhí)行m1.py,將執(zhí)行過程中產(chǎn)生的名稱都放入模塊的名稱空間中 3、在當(dāng)前執(zhí)行文件中拿到一個(gè)名字m1,該名字是指向模塊的名稱空間的 使用方法:指名道姓地訪問m1名稱空間中的名字func,優(yōu)點(diǎn)是不會(huì)與當(dāng)前名稱空間中的名字沖突,缺點(diǎn)是每次訪問都需要加上前綴 m1.func from ... import 首次from m1 import func導(dǎo)入模塊都發(fā)生三件事: 1、先創(chuàng)建一個(gè)模塊的名稱空間 2、執(zhí)行m1.py,將執(zhí)行過程中產(chǎn)生的名稱都放入模塊的名稱空間中 3、在當(dāng)前執(zhí)行文件中直接拿到一個(gè)功能名func,該名字是直接指向模塊名稱空間中的某一個(gè)功能的 使用方法:直接使用功能即可,優(yōu)點(diǎn)是無需加任何前綴,缺點(diǎn)是容易與當(dāng)前名稱空間中的名字沖突 def func(): pass func()
參照執(zhí)行文件的sys.path為基準(zhǔn)查找,既可以當(dāng)作執(zhí)行文件使用也可以當(dāng)作被導(dǎo)入的模塊使用 但文件當(dāng)作模塊使用必須參照執(zhí)行文件的環(huán)境變量來導(dǎo)入 格式為 from 文件夾 import 模塊名
. 以當(dāng)前文件的文件夾為基準(zhǔn)查找,只能被當(dāng)作模塊導(dǎo)入,不能當(dāng)作執(zhí)行文件執(zhí)行 from . import 模塊名
在導(dǎo)入包的情況下,有3種限制 1 .的方式不能出包的范圍 2 .的方式不能當(dāng)作執(zhí)行文件執(zhí)行 3 .的方式前提只能是包
內(nèi)存-》內(nèi)置模塊-》sys.path
進(jìn)行基本的日志配置:
logging.basicConfig(filename='access.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10, # stream=True )
日志級別遵循原則:自下而上進(jìn)行匹配 #debug-》info-》warning-》error-》critical:
logging.debug('調(diào)試信息') #10 logging.info('正常信息') #20 logging.warning('不好啦著火啦') #30 logging.error('報(bào)錯(cuò)信息') #40 logging.critical('嚴(yán)重錯(cuò)誤信息') #50
問題:
1、沒有指定日志級別 2、沒有指定日志格式 3、只能往屏幕打印,沒有寫入文件
新問題
#1、不能指定字符串編碼
#2、只能往文件中打印
import logging
logging模塊包含四種角色:logger,filter,formatter,handler
1、logger:負(fù)責(zé)產(chǎn)生日志信息
logger1=logging.getLogger('交易日志')
logger2=logging.getLogger('用戶相關(guān)')
2、filter:負(fù)責(zé)篩選日志
3、formatter:控制日志輸出格式
formatter1=logging.Formatter(
fmt='%(asctime)s:%(name)s:%(levelname)s:%(message)s',
datefmt='%Y-%m-%d %X'
)
formatter2=logging.Formatter(
fmt='%(asctime)s:%(message)s',
datefmt='%Y-%m-%d %X'
)
4、handler:負(fù)責(zé)日志輸出的目標(biāo)
h2=logging.FileHandler(filename='a1.log',encoding='utf-8')
h3=logging.FileHandler(filename='a2.log',encoding='utf-8')
sm=logging.StreamHandler()
5、綁定logger對象與handler對象
logger1.addHandler(h2)
logger1.addHandler(h3)
logger1.addHandler(sm)
6、綁定handler對象與formatter對象
h2.setFormatter(formatter1)
h3.setFormatter(formatter1)
sm.setFormatter(formatter2)
7、設(shè)置日志級別:可以在兩個(gè)關(guān)卡進(jìn)行設(shè)置logger與handler:
logger1.setLevel(10) h2.setLevel(10) h3.setLevel(10) sm.setLevel(10) logger1.info('Egon借給李杰100W')
LOG_PATH = os.path.join(BASE_DIR, 'log', 'user.log') 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' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定義日志輸出格式 結(jié)束 # 如果不存在定義的日志目錄就創(chuàng)建一個(gè) if not os.path.isdir(DB_PATH): os.mkdir(DB_PATH) # log文件的全路徑 # logfile_path = os.path.join(DB_PATH, 'log') # 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': LOG_PATH, # 日志文件 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M 'backupCount': 5, 'encoding': 'utf-8', # 日志文件的編碼,再也不用擔(dān)心中文log亂碼了 }, }, 'loggers': { # logging.getLogger(__name__)拿到的logger配置 '': { 'handlers': ['default', 'console'], # 這里把上面定義的兩個(gè)handler都加上,即log數(shù)據(jù)既寫入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)傳遞 }, }, } import logging.config def get_logger(name): """ 日志格式 :return: """ logging.config.dictConfig(settings.LOGGING_DIC) logger = logging.getLogger(name) # 這里的name 指的文件名 return logger
import json with open('db1.json','rt',encoding='utf-8') as f: json.load(f) # load用在文件的讀,反序列化 json.loads('{"name":"egon"}') # loads用在字典的序列化, with open('db.json','wt',encoding='utf-8') as f: l=[1,True,None] json.dump(l,f) # dump用在 序列化到文件中 x = json.dumps('name': 'egon') #dumps用在序列化 用json反序列化 with open('db.json','rt',encoding='utf-8') as f: l=json.load(f) print(l)
import pickle
1、從文件中讀取pickle格式 with open('db.pkl','rb') as f: pkl=f.read() 2、將json_str轉(zhuǎn)成內(nèi)存中的數(shù)據(jù)類型 dic=pickle.loads(pkl) print(dic['a']) 1和2可以合作一步 with open('db.pkl','rb') as f: dic=pickle.load(f) print(dic['a'])
dic={'a':1,'b':2,'c':3} 1 序列化 pkl=pickle.dumps(dic) print(pkl,type(pkl)) 2 寫入文件 with open('db.pkl','wb') as f: f.write(pkl) 1和2可以合作一步 with open('db.pkl','wb') as f: pickle.dump(dic,f) ```
什么是序列化/反序列化
序列化就是將內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成一種中間格式存儲(chǔ)到硬盤或者基于網(wǎng)絡(luò)傳輸
發(fā)序列化就是硬盤中或者網(wǎng)絡(luò)中傳來的一種數(shù)據(jù)格式轉(zhuǎn)換成內(nèi)存中數(shù)據(jù)結(jié)構(gòu)
為什么要有
1、可以保存程序的運(yùn)行狀態(tài)
2、數(shù)據(jù)的跨平臺(tái)交互
json
優(yōu)點(diǎn):
跨平臺(tái)性強(qiáng)
缺點(diǎn):
只能支持/對應(yīng)python部分的數(shù)據(jù)類型
pickle
優(yōu)點(diǎn):
可以支持/對應(yīng)所有python的數(shù)據(jù)類型
缺點(diǎn):
只能被python識別,不能跨平臺(tái)
start= time.time() time.sleep(3) stop= time.time() print(stop - start) 輸出結(jié)果: 3.000129222869873
print(time.strftime('%Y-%m-%d %X')) print(time.strftime('%Y-%m-%d %H:%M:%S %p')) 輸出結(jié)果: 2018-07-30 18:04:27 2018-07-30 18:04:27 PM
t1=time.localtime() print(t1) print(type(t1.tm_min)) print(t1.tm_mday) t2=time.gmtime() print(t1) print(t2)
獲取格式化字符串形式的時(shí)間麻煩
時(shí)間戳與格式化時(shí)間之間的轉(zhuǎn)換麻煩
獲取之前或者未來的時(shí)間麻煩.所以用到了 datetime模塊
print(datetime.datetime.now()) # 現(xiàn)在的時(shí)間 print(datetime.datetime.fromtimestamp(1231233213)) print(datetime.datetime.now() + datetime.timedelta(days=3)) # 現(xiàn)在的時(shí)間加上未來的3天 print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 現(xiàn)在的時(shí)間減去3天前 s=datetime.datetime.now() print(s.replace(year=2020)) # 修改年份
import random print(random.random())#(0,1)----float 大于0且小于1之間的小數(shù) print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之間的整數(shù) print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之間的整數(shù) print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] print(random.sample([1,'23',[4,5]],2))#列表元素任意2個(gè)組合 print(random.uniform(1,3))#大于1小于3的小數(shù),如1.927109612082716 item=[1,3,5,7,9] random.shuffle(item) #打亂item的順序,相當(dāng)于"洗牌" print(item)
def make_code(size=7): res = '' for i in range(size): # 循環(huán)一次則得到一個(gè)隨機(jī)字符(字母/數(shù)字) s = chr(random.randint(65, 90)) num = str(random.randint(0, 9)) res += random.choice([s, num]) return res res=make_code() print(res)
os.getcwd() 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑 os.chdir("dirname") 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cd os.curdir 返回當(dāng)前目錄: ('.') os.pardir 獲取當(dāng)前目錄的父目錄字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;相當(dāng)于shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報(bào)錯(cuò);相當(dāng)于shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印 os.remove() 刪除一個(gè)文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.sep 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep 輸出當(dāng)前平臺(tái)使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep 輸出用于分割文件路徑的字符串 win下為;,Linux下為: os.name 輸出字符串指示當(dāng)前使用平臺(tái)。win->'nt'; Linux->'posix' os.system("bash command") 運(yùn)行shell命令,直接顯示 os.environ 獲取系統(tǒng)環(huán)境變量 os.path.abspath(path) 返回path規(guī)范化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實(shí)就是os.path.split(path)的第一個(gè)元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結(jié)尾,那么就會(huì)返回空值。即os.path.split(path)的第二個(gè)元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對路徑,返回True os.path.isfile(path) 如果path是一個(gè)存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個(gè)存在的目錄,則返回True。否則返回False os.path.join(path2[, path3[, ...]]) 將多個(gè)路徑組合后返回,第一個(gè)絕對路徑之前的參數(shù)將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最后存取時(shí)間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時(shí)間 os.path.getsize(path) 返回path的大小
import time def make_progress(percent,width=50): if percent > 1: percent=1 show_str=('[%%-%ds]' % width) % (int(percent * width) * '#') print('\r%s %s%%' %(show_str,int(percent * 100)),end='') total_size=1025 recv_size=0 while recv_size < total_size: time.sleep(0.1) # 模擬經(jīng)過了0.5的網(wǎng)絡(luò)延遲下載了1024個(gè)字節(jié) recv_size+=1024 # 調(diào)用打印進(jìn)度條的功能去打印進(jìn)度條 percent=recv_size / total_size make_progress(percent)
pattern=re.compile('alex') print(pattern.findall('alex is SB,alex is bigSB')) # 匹配所有的'alex' print(pattern.search('alex is SB,alex is bigSB').group()) # 從行首開始匹配,沒有就返回None.有就可以通過group拿到 print(re.match('alex','123alex is SB,alex is bigSB'))#以什么結(jié)尾,有就返回這個(gè)值,沒有就返回None 結(jié)果如下: ['alex', 'alex'] alex None
import subprocess obj=subprocess.Popen( 'tasklist', shell=True, stdout=subprocess.PIPE, # 正確的管道 stderr=subprocess.PIPE # 錯(cuò)誤的管道 ) print(obj) stdout_res = obj.stdout.read() # 得到正確管道中的數(shù)據(jù) print(stdout_res.decode('gbk')) print(stdout_res) stderr_res1=obj.stderr.read() #得到錯(cuò)誤管道中的數(shù)據(jù) stderr_res2=obj.stderr.read() # 管道中的信息只能取一次 stderr_res3=obj.stderr.read() print(stderr_res1.decode('gbk')) print(stderr_res1) print(stderr_res2) print(stderr_res3)
什么是hash
hash是一種算法,該算法接受傳入的內(nèi)容,經(jīng)過運(yùn)算得到一串hash值
如果把hash算法比喻為一座工廠
那傳給hash算法的內(nèi)容就是原材料
生成的hash值就是生產(chǎn)出的產(chǎn)品
為何要用hash算法
hash值/產(chǎn)品有三大特性:
1、只要傳入的內(nèi)容一樣,得到的hash值必然一樣
2、只要我們使用的hash算法固定,無論傳入的內(nèi)容有多大,
得到的hash值的長度是固定的
3、不可以用hash值逆推出原來的內(nèi)容
基于1和2可以在下載文件時(shí)做文件一致性校驗(yàn) 基于1和3可以對密碼進(jìn)行加密
怎么用
import hashlib
1、造出hash工廠
m=hashlib.sha512('你'.encode('utf-8'))
2、運(yùn)送原材料 m.update('好啊美sadfsadf麗asdfsafdasdasdfsafsdafasdfasdfsadfsadfsadfsadfasdff的張銘言'.encode('utf-8'))
3、產(chǎn)出hash值
print(m.hexdigest()) #2ff39b418bfc084c8f9a237d11b9da6d5c6c0fb6bebcde2ba43a433dc823966c
with open('old.xml','r') as read_f,open('new.xml', 'w') as write_f:
shutil.copyfileobj(read_f,write_f)
shutil.make_archive("data_bak", 'gztar', root_dir='D:\SH_fullstack_s2\day04')
t=tarfile.open('data_bak.tar.gz','r') t.extractall('D:\SH_fullstack_s2\day20\dir') t.close()
import xml.etree.ElementTree as ET tree = ET.parse("a.xml") # 打開一個(gè)xml的文件 root = tree.getroot() # 用getroot 拿到樹根 對于任何標(biāo)簽都有三個(gè)特征:標(biāo)簽名、標(biāo)簽屬性、標(biāo)簽的文本內(nèi)容 print(root.tag)# 標(biāo)簽名 print(root.attrib)# 標(biāo)簽屬性 print(root.text)# 文本內(nèi)容 print(list(root.iter('year'))) #全文搜索,找到所有 for year in root.iter('year'): print(year.tag) print(year.attrib) print(year.text) print('='*100) print(root.find('country').attrib) #在root的子節(jié)點(diǎn)找,只找一個(gè) print([country.attrib for country in root.findall('country')]) #在root的子節(jié)點(diǎn)找,找所有 root.iter('year') #全文搜索 root.findall('country') # 在root的子節(jié)點(diǎn)找,找所有 root.find('country') # 在root的子節(jié)點(diǎn)找,只找一個(gè) 1、查 遍歷整個(gè)文檔 for country in root: print('============>國家 %s' %country.attrib) for item in country: print(item.tag) print(item.attrib) print(item.text) 2、改 for year in root.iter('year'): print(year.tag) year.attrib={'updated':'yes'} year.text=str(int(year.text)+1) tree.write('a.xml') 3、增 for country in root: rank=country.find('rank') if int(rank.text) > 50: # print('符號條的國家',country.attrib) tag=ET.Element('egon') tag.attrib={'updated':'yes'} tag.text='NB' country.append(tag) tree.write('a.xml') 4、刪 for country in root: tag=country.find('egon') #print(tag,bool(tag)) if tag is not None: print('====>') country.remove(tag) tree.write('a.xml')
config = configparser.ConfigParser() config.read('config.ini') # a.cfg a.ini a.cnf print(config.sections()) # 去除標(biāo)題 print(config.options('egon')) # 把這個(gè)目錄下的k取出來 print(config.items('egon')) # 取出 這個(gè)目錄下的所有,放到元組中 res = config.get('egon','age') res = config.getint('egon', 'age') print(res, type(res)) res = config.getfloat('egon', 'salary') print(res, type(res)) res = config.getboolean('egon', 'is_beautiful') print(res, type(res)) 輸出結(jié)果如下: ['egon', 'alex'] ['pwd', 'age', 'sex', 'salary', 'is_beautiful'] [('pwd', "'123'"), ('age', '18'), ('sex', "'male'"), ('salary', '3.1'), ('is_beautiful', 'True')] 18 <class 'int'> 3.1 <class 'float'> True <class 'bool'>
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“python模塊怎么用”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。