一, 時間模塊 1. 時間格式 時間戳格式 / float 數據類型 / 格林威治時間 (給機器看的) print(time.time()) 結構化時間 / 時間對象 (從給機器看轉換成給人看的過度) 能夠通過 . 屬性名來獲取對象中的值 print(time.strftime( ' %Y-%m-% ...
一, 時間模塊
1. 時間格式
時間戳格式 / float 數據類型 / 格林威治時間 (給機器看的)
print(time.time())
結構化時間 / 時間對象 (從給機器看轉換成給人看的過度)
能夠通過 . 屬性名來獲取對象中的值
print(time.strftime( ' %Y-%m-%d ' ))
格式化時間 / 字元串時間 / str數據類型 (主要方便給人們看的)
可以通過你需要的格式來顯示時間
time_obj = time.localtime()
2.
struct_time 表示結構化時間 ;
Format string 表示格式化時間;
Timestamp 表示時間戳時間.
print(time.time()) #表示此刻時間戳時間 print(time.localtime(1500000000)) #表示該時間戳的結構化時間 time_obj = time.localtime(1500000000) #時間戳時間轉換成結構化時間 format_time = time.strftime('%y-%m-%d' , time_obj) #結構化時間 #轉換成格式化時間 print(format_time) #2018-8-8 格式化時間 struct_time = time.strptime('2018-8-8','%Y-%m-%d') #格式化時間#轉換成結構化時間 print(struct_time) print(time.mktime(struct_time)) #結構化時間轉換成時間戳時間
二, sys模塊 (和Python解釋器聯繫的)
sys.ext() 結束程式 (強制解釋器停止)
sys.argv
print(sys.argv)
結果為列表類型
第一個元素是執行這個文件的時候,寫在Python命令後面的第一個值 之後的元素在執行Python
的啟動的時候可以寫多個值(cmd中),都會被依次添加到列表中
三, os模塊
print(os.getcwd()) 當前文件的工作路徑 即 在哪執行該文件,getcwd的結果就是哪個路徑 並非該
文件路徑
創建文件夾 / 刪除文件夾
os.mkdir('dir/dir2') 創建單級文件夾 若 dir 目錄存在則 dir2 可以創建,否則不能創建
os.makedirs('dir1/dir2/dir3') 創建多級文件夾 創建多級嵌套文件夾dir1 dir2 dir3 若文件夾存
在則報錯
os.makedirs('dir1/dir2/dir3' , exist_ok=True) 若存在不報錯,會覆蓋原文件夾
os.rmdir('dir1dir2/dir3') 只能刪去一級 不能刪除非空文件夾
os.removedirs('dir1dir2/dir3') 遞歸向上刪除文件夾,從最底層開始向上刪除空文件夾,若上一級目錄
有其它文件則停止
os.listdir() 查看某一路徑下的所有文件及其文件夾,以列表的形式存放
os.stat() 獲取文件 / 目錄信息
path系列
os.path.abspath() 若給的是相對路徑則會返回絕對路徑,若給的路徑不規範 (/) 則會改正
os.path.get.size() 查看文件 / 文件夾大小 (所有文件夾大小都是4096)
四, 序列化模塊
字典,列表,數字,對象等序列化成字元串 (序列化)
字元串反序列化成字典,列表,數字,對象等 (反序列化)
1. 為什麼要序列化
把內容寫入文件
網路傳輸數據
2. 方法
json : (限制較多)
dic = {'aaa':'bbb','ccc':'ddd'} str_dic = json.dumps(dic) #序列化 print(dic) print(str_dic,type(dic)) #結果: {'aaa':'bbb','ccc':'ddd'} {"aaa":"bbb","ccc":"ddd"} <class 'str'> ret = json.loads(str_dic) # 反序列化 print(ret,type(ret)) #結果: {'aaa':'bbb','ccc':'ddd'} <class 'dict'>
寫入文件:(對文件操作用dump /l oad)
dic = {'aaa':'bbb','ccc':'ddd'} with open ('json_dump','w') as f: json.dump(dic,f) # 把字典以字元串的方式寫入
with open ('json_dump') as f:
print(type(json.load(f)))
#結果 <class 'dict'>
3. json限制 :
json格式的key必須是字元串數據類型
import json dic = {1:2,3:4} str_dic = json.dumps(dic) print(str_dic) #結果 {"1":2,"3":4} #json格式的 key 必須是字元串數據類型,如果是數字為 key,那麼dump之後就# 會強行轉換成字元串數據類型 dic = {'abc':(1,2,3)} str_dic = json.dumps(dic) #json print(str_dic) new_dic = json.loads(str_dic) print(new_dic) #結果 {"abc":[1,2,3]} {'abc':[1,2,3]} #對元組做value的字典會把元組強制轉換成列表 dic = {(1,2,3):'abc'} str_dic = json.dumps(dic) #json print(str_dic) #結果 報錯 #不支持,
json格式中字元串只能是雙引號(" ")
lst = ['aa',123,'bb'] with open('json_demo','w' ) as f : json.dump(lst,f) #結果 ["aa",123,"bb"] 若在文件中把雙引號改為單引號則反序列讀取報錯 with open ('json_dem') as f: ret = json.load(f) print(ret) #結果 ['aa',123,'bb']
能夠多次dump變數/對象,但是不能load多個變數/對象 , 可以用dumps/loads操作
中文格式
dic = {'abc':(1,2,3) , 'cour':'中國'} ret = json.dumps(dic) print(ret) # 在序列化中 漢子 會編程unicode編碼 #結果 {"abc":[1,2,3] , "cour":"\u4e2d\u56fd"} dic_new = json.load(ret) print(dic_new) #結果 {'abc':(1,2,3) , 'cour':'中國'} 不影響反序列化
dumps中參數 ensure_ascii 表示用ascii存儲
json 其他參數(存的時候浪費空間)
左後一段中 : sort_keys=True表示以key的值排序 ; indent = 2 表示縮進單位 ;
separators = (',',':') 表示以 ',',':' 為分隔符 ; ensure_ascii = Flaser 表示用漢字
set 類型不允許進行序列化
pickle: (支持幾乎所有對象)
import pickle dic = {1:(1,2),('a','b'):4} #key為數字,元組類型 pic_dic = pickle.dumps(dic) print(pic_dic) #結果 一串bytes類型(不會報錯) new_dic = pickle.loads(pic_dic) print(new_dic) #結果 {1:(1,2),('a','b'):4}
對於對象序列化需要這個對象對應的類在記憶體中
class Student : def __init__(self,name,age) : self.name = name self.age = age hehe = Student('hehe',83) with open('pickle_demo', 'wb' ) as f : pickle.dump(hehe,f) with open('pickle_demo', 'rb' ) as f : haha = pickle.load(f) print(haha) #結果 hehe # 在對文件操作時應該以 rb / wb 等的形式打開 pickle 只支持bytes類型
能夠多次dump變數/對象,而且能load多個變數/對象
不可以for迴圈文件句柄,因為文件寫入是bytes類型,沒有分隔符,不能分行.
shelve: open()方法
一次性存進去的key值,可以用key的方式全部拿出來,不用一個一個拿出來
用法:
import shelve f = shelve.open('shelve_demo') f['key'] = {'k1':(1,2),'k2':'v2'} f.close() f = shelve.open('shelve_demo') con = f['key'] f.close() print(con) #結果 {'k1':(1,2),'k2':'v2'}
註意:shelve 不支持多個應用同一時間往同一個文件進行寫操作,但是在只讀操作下允
許通過讀操作打開文件 . 然而讀操作時不穩定,不排除寫的可能.
hashlib (摘要演算法的模塊)
能夠把一個字元串數據類型的變數轉換成一個定長的密文的字元串,字元串里的每一個字元
都是十六進位
對於同一個字元串,無論多長只要相同的,在任何環境下,多次執行,在任何語言中使用相同
演算法/手段得到的結果永遠是相同的 , 只要是不是相同的字元串結果一定不同
md5()演算法 : 32位的字元串
update() ; hexdigest() 方法
用法 : 登錄驗證 ; 文件內容的一致性校驗 ; 大文件的已執行校驗
sha1()演算法 :40位的字元串
用法和md5演算法相同
md5演算法計算簡單,計算相對較快,
sha1演算法相對複雜,計算速度慢
註意 : 倆種演算法都不能倒推,不能直接通過密文的字元串倒推出原字元串值
動態加鹽:
md5obj = hashlib.md5(username) #username 為鹽 #例如 : 游戲昵稱不一樣,動態加鹽後安全性更高 md5obj.update(passwd) #對passwd進行加密/摘要 md5obj.hexdigest()
檢驗倆個文件內容是否一致
大文件的已執行校驗:
對同一字元串的幾個階段的分別摘要的結果 , 和整體摘要結果一樣
md5_obj = hashlib.md5() md5_obj.update('hello,dazhi,sb'.encode('utf-8')) print(md5_obj.hexdigest()) md5_obj = hashlib.md5() md5_obj.update('hello'.encode('utf-8')) md5_obj.update('dazhi'.encode('utf-8')) md5_obj.update('sb'.encode('utf-8')) print(md5_obj.hexdigest())
configparser
有一個固定格式的配置文件
有一個對應的模塊去幫你做這個文件的字元串處理
用法:
import configparser #導入模塊 config = configparser.Configparser() #實例化對象 config['DEFAULT'] = {'Serve':'45' 'Compre':'yes' 'Compre':'9' } #將要寫入的組名和內容
#該組為全局組,可以通過其他組拿到
config['bitbucket.org']={'user':'hg'}
with open('example.ini','w') as f : config.write(f) #此write是config對象的,不是 f 句柄或文件的
print('bitbucket.org' in config) #True 有該組則返回 T 沒有返回 F
print(config['bitbucket.org'] ['user']) #hg
增刪改操作
logging
功能 : 1. 日誌格式的規範 2. 操作的簡化 3. 日誌分級
模塊的使用 :
普通配置型 簡單的 可制定化差
對象配置型 複雜的 可定製化強
日誌的分級
級別由高到低
配置報錯格式
import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s%(filename)s%[line:%(lineno)d]%(levelname)s%(message)s', #報錯時間 ; 錯誤文件 ; 哪行報錯 ;報錯級別 ; 錯誤信息 datefmt='%a,%d %b %Y %H:%M:%S',#時間格式,可以自定義 filename='/tmp/test.log', #把報錯寫入文件 filemode='w')
..........
#不能將一個log信息即輸出到屏幕 又輸出到文件
logger對象的形式操作日誌文件
既能往文件里輸入還能往屏幕上輸出
import logging # 創建一個logger對象 logger = logging.getLogger() # 創建一個文件操作符 fh = logging.FileHandler('logger.log',encoding='utf-8') # 創建一個屏幕管理操作符 fh = logging.StreamHandler() # 創建一個日誌輸出的格式 format1 = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') # 文件管理操作符 綁定一個 格式 fh.setFormatter(format1) # # 屏幕管理操作符 綁定一個 格式 sh.setFormatter(format1) logger.setLevel(logging.DEBUG) # logger對象 綁定 文件管理操作符 logger .addHandler(fh) # logger對象 綁定 屏幕管理操作符 logger.addHandler() logger.debug('debug message') logger.info('我的信息') logger.warning('warning message') logger.error('error message') logger.critical('critical message')