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、使程序更具维护性。

img

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()
posted @   EJW  阅读(102)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示