1. 程式人生 > 實用技巧 >time&random&序列化&hashlib&shutil模組

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

  1. 密碼加密,不已 密文形式儲存密碼

  2. 檔案的校驗

用法:

  1. 將bytes型別位元組,轉化成 固定長度的16進位制數字組成的字串
  2. 不同的bytes型別利用相同的演算法(MD5)轉換的結果一定不同
  3. 相同的bytes利用相同的演算法(MD5)轉換成的結果一定相同
  4. 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()