1.序列
1.1json模塊
json模塊是將滿足條件的數據結構轉化成特殊的字符串,並且也可以反序列化還原回去。
用於網絡傳輸:dumps、loads
用於文件寫讀:dump、load
dumps、loads
import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic) #序列化:將一個字典轉換成一個字符串
print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json轉換完的字符串類型的字典中的字符串是由""表示的
dic2 = json.loads(str_dic) #反序列化:將一個字符串格式的字典轉換成一個字典
#注意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示
print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以處理嵌套的數據類型
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
dump、load
import json
f = open('json_file.json','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f) #dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件
f.close()
# json文件也是文件,就是專門存儲json字符串的文件。
f = open('json_file.json')
dic2 = json.load(f) #load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回
f.close()
print(type(dic2),dic2)
1.2 pickle模塊
pickle模塊是將Python所有的數據結構以及對象等轉化成bytes類型,然后還可以反序列化還原回去。
用於網絡傳輸:dumps、loads
用於文件寫讀:dump、load
dumps、loads
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic) # bytes類型
dic2 = pickle.loads(str_dic)
print(dic2) #字典
# 還可以序列化對象
import pickle
def func():
print(666)
ret = pickle.dumps(func)
print(ret,type(ret)) # b'\x80\x03c__main__\nfunc\nq\x00.' <class 'bytes'>
f1 = pickle.loads(ret) # f1得到 func函數的內存地址
f1() # 執行func函數
dump、load
dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
f = open('pick序列化',mode='wb')
pickle.dump(dic,f)
f.close()
with open('pick序列化',mode='wb') as f1:
pickle.dump(dic,f1)
2. os模塊
當前執行這個python文件的工作目錄相關的工作路徑
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 **
os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd **
os.curdir 返回當前目錄: ('.') **
os.pardir 獲取當前目錄的父目錄字符串名:('..') **
# 和文件夾相關
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 ***
os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 ***
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname ***
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname ***
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印 **
# 和文件相關
os.remove() 刪除一個文件 ***
os.rename("oldname","newname") 重命名文件/目錄 ***
os.stat('path/filename') 獲取文件/目錄信息 **
os.environ #獲取系統環境變量 **
#path系列,和路徑相關
os.path.abspath(path) #返回path規范化的絕對路徑 ***
os.path.split(path) #將path分割成目錄和文件名二元組返回 ***
os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素 **
os.path.basename(path) #返回path最后的文件名。如何path以/或\結尾,那么就會返回空值,即os.path.split(path)的第二個元素。 **
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False ***
os.path.isabs(path) #如果path是絕對路徑,返回True **
os.path.isfile(path) #如果path是一個存在的文件,返回True。否則返回False ***
os.path.isdir(path) #如果path是一個存在的目錄,則返回True。否則返回False ***
os.path.join(path1,path2,...) #將多個路徑組合后返回,第一個絕對路徑之前的參數將被忽略 ***
os.path.getatime(path) #返回path所指向的文件或者目錄的最后訪問時間 **
os.path.getmtime(path) #返回path所指向的文件或者目錄的最后修改時間 **
os.path.getsize(path) #返回path的大小 ***
3. sys模塊
sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 ***
4. hashlib模塊
密碼的加密。
文件一致性校驗。
4.1 密碼的加密
4.1.1 普通加密:
import hashlib
md5 = hashlib.md5()
md5.update('123456'.encode('utf-8'))
print(md5.hexdigest())
# 計算結果如下:
'e10adc3949ba59abbe56e057f20f883e'
# 驗證:相同的bytes數據轉化的結果一定相同
import hashlib
md5 = hashlib.md5()
md5.update('123456'.encode('utf-8'))
print(md5.hexdigest())
# 計算結果如下:
'e10adc3949ba59abbe56e057f20f883e'
# 驗證:不相同的bytes數據轉化的結果一定不相同
import hashlib
md5 = hashlib.md5()
md5.update('12345'.encode('utf-8'))
print(md5.hexdigest())
# 計算結果如下:
'827ccb0eea8a706c4c34a16891f84e7b'
4.2 文件的一致性校驗
def file_check(file_path):
with open(file_path,mode='rb') as f1:
sha256 = hashlib.sha256()
while 1:
content = f1.read(1024)
if content:
sha256.update(content)
else:
return sha256.hexdigest()
print(file_check('pycharm-professional-2019.1.1.exe'))
5.時間有關的模塊
5.1 time模塊
(1)時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。
(2)格式化的時間字符串(Format String):
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鍾數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身
(3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
索引(Index) | 屬性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(時) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第幾天) | 1 - 366 |
8 | tm_isdst(是否是夏令時) | 默認為0 |
#導入時間模塊
>>>import time
#時間戳
>>>time.time()
1500875844.800804
#時間字符串
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 13:54:37'
>>>time.strftime("%Y-%m-%d %H-%M-%S")
'2017-07-24 13-55-04'
#時間元組:localtime將一個時間戳轉換為當前時區的struct_time
time.localtime()
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,
tm_hour=13, tm_min=59, tm_sec=37,
tm_wday=0, tm_yday=205, tm_isdst=0)
# 格式化時間 ----> 結構化時間
ft = time.strftime('%Y/%m/%d %H:%M:%S')
st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
print(st)
# 結構化時間 ---> 時間戳
t = time.mktime(st)
print(t)
# 時間戳 ----> 結構化時間
t = time.time()
st = time.localtime(t)
print(st)
# 結構化時間 ---> 格式化時間
ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
print(ft)
6.random模塊
>>> import random
#隨機小數
>>> random.random() # 大於0且小於1之間的小數
0.7664338663654585
>>> random.uniform(1,3) #大於1小於3的小數
1.6270147180533838
#恆富:發紅包
#隨機整數
>>> random.randint(1,5) # 大於等於1且小於等於5之間的整數
>>> random.randrange(1,10,2) # 大於等於1且小於10之間的奇數
#隨機選擇一個返回
>>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#隨機選擇多個返回,返回的個數為函數的第二個參數
>>> random.sample([1,'23',[4,5]],2) # #列表元素任意2個組合
[[4, 5], '23']
#打亂列表順序
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打亂次序
>>> item
[5, 1, 3, 7, 9]
>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]
7.logging模塊
(旗艦版logging)
import logging.config # 注意不是logging,而是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]'
# 定義日志輸出格式 結束
# 確定log文件名與log文件的路徑
logfile_name = 'login.log'
logfile_path_staff = r'D:\s23\day19\日志模塊\旗艦版日志文件夾\staff.log'
logfile_path_boss = r'D:\s23\day19\日志模塊\旗艦版日志文件夾\boss.log'
# 可以使用os模塊使路徑動態化
# log配置字典
LOGGING_DIC = {
'version': 1, # 版本號(固定寫法)
'disable_existing_loggers': False, # 固定寫法(固定寫法)
# 以上兩個為固定寫法
# 格式,每個鍵對應一個字典,字典中有你想要定義的格式
'formatters': {
'standard': {
'format': standard_format
}, # standard_format
'simple': {
'format': simple_format
}, # simple_format
},
# 格式配置結束
'filters': {}, # 過濾器(不用理他,默認不寫就好)
# 處理器開始編寫
'handlers': {
# 打印到終端的日志
'sh': {
'level': 'DEBUG', # 設置提示級別
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'id_simple' # 打印格式
},
# 打印到文件的日志,收集info及以上的日志
'fh': {
'level': 'DEBUG', # 設置提示級別
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard', # 日志的寫入格式
'filename': logfile_path_staff, # 日志文件路徑
'maxBytes': 5000, # 日志大小 5M
'backupCount': 5, # 輪轉數量
'encoding': 'utf-8', # 日志文件的編碼,再也不用擔心中文log亂碼了
},
},
# 最后的收尾工作了
'loggers': {
# 一會通過logging.getLogger(__name__)拿到的logger配置,然后進行log的書寫
'': { # ''這個空字符為固定寫法
# 這里把上面定義的兩個handler都加上,即log數據既寫入文件又打印到屏幕
'handlers': ['sh', 'fh'],
'level': 'DEBUG', # 設定log全局的最低級別
'propagate': True, # 向上(更高level的logger)傳遞
},
},
}
def md_logger():
logging.config.dictConfig(LOGGING_DIC) # 導入上面定義的logging配置
logger = logging.getLogger() # 生成一個log實例
logger.debug('It works!') # 記錄該文件的運行狀態
# logger.info('It works!') # 通過logger.(信息級別)記錄
# logger.warning('It works!')