time&random&序列化&hashlib&shutil模組
一、time&random模組
print(time.localtime(1596097258.078811)) aa = time.localtime(1596097258.078811) time.sleep(1) print(time.mktime(aa)) print(time.asctime()) print(time.strftime("%Y-%m-%d %H:%M", time.localtime())) # 顯示本地時間 print(time.strptime('2017-10-3 17:54', "%Y-%m-%d %H:%M")) #將時間字元轉換成字串 import datetime print(datetime.date.today()) #當前日期 print(datetime.datetime.now()) #現在時間 import random print(random.randrange(1, 10)) # 一到十的隨機數 print(random.randrange(0, 100, 2)) #0到100的隨機數步長為2 print(random.random())
二、序列化pickle&json模組
定義:將一種資料結構如列表,字典,元組等轉換成特殊的序列
為什麼存在序列化?
-
資料儲存再檔案中,str形式儲存,比如字典
-
資料通過網路傳輸(bytes型別),不能還原回去
-
特色的字串:序列化
1、以某種儲存形式使自定義物件持久化;
2、將物件從一個地方傳遞到另一個地方。
3、使程式更具維護性。
2.1 pickle模組
- 只能是python語言遵循的一種資料轉換格式,只能再python語言中使用
- 支援python所有資料型別,包括例項化物件
dumps和loads 只能用於網路傳輸
import pickle dic = {'username':'老王','password':'123','status':'true'} st = pickle.dumps(dic) #轉換為二進位制資料 print(st,type(st)) l2 = pickle.loads(st) #將二進位制資料還原成轉換之前的型別 print(l2,type(l2))
dump和load可直接寫入,還能轉換多個數據
import pickle dic = {'username':'老王'} dic1 = {'username':'老王1'} dic2 = {'username':'老王2'} f = open('pick多資料',mode='wb') pickle.dump(dic,f) #將多行資料轉換成二進位制格式 pickle.dump(dic1,f) pickle.dump(dic2,f) f.close() f = open('pick多資料',mode='rb') print(pickle.load(f)) #將二進位制資料進行還原 print(pickle.load(f)) print(pickle.load(f)) f.close()
pickle 將函式物件進行轉換
import pickle
def func():
print('in func')
f = open('pickle11',mode='wb')
pickle.dump(func,f) #將函式轉換從二進位制
f.close()
f = open('pickle11',mode='rb')
ret = pickle.load(f) #將二進位制資料進行還原
print(ret)
ret()
2.2 json模組
- 將資料結構轉換成特殊的字串,並且可以反轉回去
兩對四種方法
網路傳輸
dumps loads 主要用於網路傳輸,但是也可以寫入檔案
import json
dumps loads
st = json.dumps(dic,ensure_ascii=False)
print(st,type(st))
dic1 = json.loads(st)
print(dic1,type(dic1))
# 轉換成特殊的字元轉寫入檔案
with open('json檔案',encoding='utf8',mode='w') as f1:
st = json.dumps(dic)
f1.write(st)
# 讀取出來還原
with open('json檔案',encoding='utf8',mode='r') as f2:
st = f2.read()
l1 = json.loads(st)
print(l1,type(l1))
dump load 只能寫入檔案,只能寫入一個數據結構
# dump load 只能寫入檔案,只能寫入一個數據結構
dic = {'username':'老王','password':'123','status':'true'}
with open('json檔案1',encoding='utf-8',mode='w') as f1:
json.dump(dic,f1)
# 讀取資料
dic = {'username':'老王','password':'123','status':'true'}
with open('json檔案1',encoding='utf-8') as f1:
ll = json.load(f1)
print(ll,type(ll))
一次寫入檔案多個數據怎麼做?用dumps 和 loads
dic = {'username':'老王'}
dic1 = {'username':'老王1'}
dic2 = {'username':'老王2'}
with open('json2檔案',encoding='utf8',mode='w') as f1:
f1.write(json.dumps(dic) + '\n')
f1.write(json.dumps(dic1) + '\n')
f1.write(json.dumps(dic2) + '\n')
with open('json2檔案',encoding='utf8',mode='r') as f1:
for i in f1:
print(json.loads(i))
三、hashlib模組
包括很多加密演算法,MD5,sh1 sha256 sha512
-
密碼加密,不已 密文形式儲存密碼
-
檔案的校驗
用法:
- 將bytes型別位元組,轉化成 固定長度的16進位制數字組成的字串
- 不同的bytes型別利用相同的演算法(MD5)轉換的結果一定不同
- 相同的bytes利用相同的演算法(MD5)轉換成的結果一定相同
- hashlib的演算法是不可逆的(MD5被中國王曉雲破解了)
計算字串MD5的值
import hashlib
s1 = 'sadfsadtgyq3ewrasdfvcsas拉拉設計的'
ret = hashlib.md5()
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())
例子:校驗使用者登陸
import hashlib
def passwo(pwd):
ret = hashlib.md5()
ret.update(pwd.encode('utf-8'))
return ret.hexdigest()
def regidter():
username = input("請輸入一個使用者名稱:").strip()
password = input('請輸入密碼:').strip()
password_md5 = passwo(password)
with open('register',encoding='utf-8',mode='a') as f1:
f1.write(f'\n{username}|{password_md5}')
regidter()
def login():
username = input("請輸入一個使用者名稱:").strip()
password = input('請輸入密碼:').strip()
passs_md5 = passwo(password)
bidui = (f'{username}|{passs_md5}')
with open('register',encoding='utf-8',mode='r') as f1:
readlines = f1.readlines()
b = []
for i in readlines:
a = i.strip()
if a == bidui:
b.append(a)
if not b:
print('使用者名稱不存在或者密碼錯誤')
else:
print(f'登入成功你的使用者名稱|密碼為:{b[0]}')
login()
MD5加鹽
import hashlib
s2 = "123"
ret = hashlib.md5('12'.encode('utf-8')) #這裡的12就是加的鹽,把12換成動態可變的就是動態加鹽
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
sha系列 ,金融類,安全類,用這個級別
隨著sha系列數字越高,加密越複雜,越不容易破解,但是耗時越長
s2 = 'sadfasdfsdfa'
ret = hashlib.sha3_512()
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
檔案校驗
import hashlib
# 檔案校驗
def file_md5(path):
ret = hashlib.sha3_256()
with open(path,encoding='utf-8',mode='r') as f1:
b1 = f1.read()
ret.update(b1.encode('utf-8'))
return ret.hexdigest()
reesult = file_md5('json檔案')
print(reesult)
四、檔案copy模組shutil
shutil.copyfileobj(fsrc, fdst[, length])
將檔案內容拷貝到另一個檔案中
import shutilshutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
shutil.copyfile(src, dst)
拷貝檔案
shutil.copyfile('f1.log', 'f2.log') #目標檔案無需存在
shutil.copymode(src, dst)
僅拷貝許可權。內容、組、使用者均不變
shutil.copymode('f1.log', 'f2.log') #目標檔案必須存在
shutil.copystat(src, dst)
僅拷貝狀態的資訊,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目標檔案必須存在
shutil.copy(src, dst)
拷貝檔案和許可權
import shutilshutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)
拷貝檔案和狀態資訊
import shutilshutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞迴的去拷貝資料夾
import shutilshutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,注意對folder2目錄父級目錄要有可寫許可權,ignore的意思是排除
shutil.rmtree(path[, ignore_errors[, onerror]])
遞迴的去刪除檔案
import shutilshutil.rmtree('folder1')
shutil.move(src, dst)
遞迴的去移動檔案,它類似mv命令,其實就是重新命名。
import shutilshutil.move('folder1', 'folder3')
shutil.make_archive(base_name, format,…)
建立壓縮包並返回檔案路徑,例如:zip、tar
可選引數如下:
- base_name: 壓縮包的檔名,也可以是壓縮包的路徑。只是檔名時,則儲存至當前目錄,否則儲存至指定路徑,
如 data_bak =>儲存至當前路徑
如:/tmp/data_bak =>儲存至/tmp/
- format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要壓縮的資料夾路徑(預設當前目錄)
- owner: 使用者,預設當前使用者
- group: 組,預設當前組
- logger: 用於記錄日誌,通常是logging.Logger物件
#將 /data 下的檔案打包放置當前程式目錄
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
#將 /data下的檔案打包放置 /tmp/目錄
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
shutil 對壓縮包的處理是呼叫 ZipFile 和 TarFile 兩個模組來進行的,詳細:
zipfile壓縮&解壓縮tarfile壓縮&解壓縮
import tarfile
# 壓縮
>>> t=tarfile.open('/tmp/egon.tar','w')
>>> t.add('/test1/a.py',arcname='a.bak')
>>> t.add('/test1/b.py',arcname='b.bak')
>>> t.close()
# 解壓
>>> t=tarfile.open('/tmp/egon.tar','r')
>>> t.extractall('/egon')
>>> t.close()