Fork me on Gitee

day16,os,sys,datetime,序列化和反序列化,json,pickle,collectons模块

"""
os:和操作系统相关的操作被封装到这个模块中
"""
import os

和文件相关的,重命名,删除

删除文件

os.remove('a.txt')

重命名文件

os.rename('a.txt','b.txt')

删除目录

shutil 模块

import shutil
shutil.rmtree('aa')

不管目录是否有文件都直接删除 谨慎使用

和路径相关的操作,被封装到另一个子模块当中:os.path

找到一个路径下的上一级路径

os.path.dirname() # 不会判断路径是否存在

获取文件名,得到一个文件的最底层文件名

os.path.basename()

切割文件路径

os.path.split()

把路径中的路径名和文件名切分开,结果是元祖

路径拼接

os.path.join('d:\','a','b','t.txt')

会形成一个拼接好的路径

os.path.abspath('aaa')

得到一个基于当前路径下的另外一个路径

D:\3090\day16\aaa

判断

os.path.isabs() 是不是绝对路径

os.path.isdir() 是不是目录

os.path.exists() 判断文件或文件夹是否存在

os.path.isfile() 判断文件是不是存在

"""
sys和python解释器相关的操作
"""

获取以命令行方式运行脚本所传入的参数

sys.argv()
import sys
sys.argv[0] # 第一个为脚本名字
sys.argv[1] # 第二个为使用脚本时传入的第一个参数
sys.argv[2] # 传入的第二个参数

sys.path

解释器寻找模块的路径

sys.path是一个列表,里面是解释器寻找模块的路径,当一个模块要导入另外一个模块使用

时,得先吧这个模块的绝对路径添加sys.path中,如果是相对路径位置则不需要添加也能使用

sys.modules 查看内存中导入的模块

"""
time模块

"""
import time

获取时间戳

时间戳:从计算机元年(1970 1 1 00:00:00) 到现在所经过的秒数

time.time()

获取格式化的时间

time.localtime(),time.gmtime()

格式化的时间是由九个字段组成

获取字符串时间

格式化的时间通过strftime()的方式可以获取字符串时间

字符串时间也可以通过strptime()的方式获取格式化的时间

time.strftime('%Y-%m-%d %H-%M-%S',date)

time模块通常用于时间的相互装换例如从欧洲时间转换为亚洲时间

9 9 2010

date = time.strptime('%m-%d-%Y %H:%M:%S',data) # 结构化的时间
date = time.mktime(date) # 时间戳
date = time.localtime(date) # 结构化的时间
date = time.strftime('%Y-%m-%d %H-%M-%S',date)

"""
datetime模块
日期时间模块
封装了一些和日期,时间相关的类
date
time
datetime
timedelta
"""
import datetime

date类

d = datetime.date(2021 11 5)

d.year d.day

time类

d = datetime.time(10 10 10)

打印:10:10:10

d.hour ,d.second

datetime类

d = datetime.datetime(2021 11 5 9 41 41)

datetime中的类主要是用于时间相关的计算

通过datetime.timedelta()来计算

例如

now = datetime.datetime(2021 11 5 9 45 00)

d = datetime.timedelta(days = 20,hours = 2)

now += d

print(now)

2021-11-25 11:45:00

datetime模块练习,判断某一年是否是闰年

year = input('input a year')

d = datetime.date(yead 3 1)

t = datetime.timedelta(days = 1)

d -= t

print(d.day)

"""
序列化
把内存中的结构化的数据转化为字节串的过程叫序列化
反序列化
把字节串转换为结构化的数据叫反序列化
"""
import json

python 中json可以把结构化的数据转化为json字符串

dumps 在内存中的序列化,序列化得到的字符串也存在于内存中

s = json.dumps((1,2,3)) # 元祖序列化成一个列表

dump 把内存中的数据序列化到文件中

with open('a.txt',encoding = 'utf-8') as f:
json.dump([1,2,3],f)

load

把文件中的字节串反序列化到内存中变成结构化的数据

loads在内存中吧字节串反序列化

通过json的方法一次性写入文件

with open('a.txt',mode='at',encoding='utf-8') as f:

json.dump([1,2,3],f)

通过f.write(josn.dumps())的方式多次序列化写入文件

with open('a.txt',mode='at',encoding='utf-8') as f:

f.write(json.dumps([1,2,3])+'\n')

f.write(json.dumps([4,5,6])+'\n')

通过json.loads(f.readline().strip)的方式从文件中多次反序列化出文件中的数据

with open('a.txt','rt',encoding='utf-8') as f:

for i in f:

json.loads(i)

hashlib模块=============================================

md5加密算法
给一个数据加密的三大步骤:
1.获取一个加密对象
2.使用加密方法update()进行加密,可以调用多次
3.hexdigest()获取加密结果,或digest()方法,前者得到字符串后者是字节
"""

import hashlib

获取一个加密对象

m = hashlib.md5()

使用加密对象的update,进行加密

b不能把中文转化为字节类型,用完他用的是ASCII码不能识别中文只能中.encode的方法

m.update('abc'.encode('utf-8'))

res = m.hexdigest()

print(res.class)

给一个数据加密

验证:给另一个数据加密,如果得到的密文相同则原文相同否则不同。

不同加密算法,加密长度不同

注册和登陆

def register():

import hashlib

import pickle

name_input = hashlib.md5(input('input your name').encode('utf-8')).hexdigest()

password_input = hashlib.md5((input('input your password').strip()).encode('utf-8')).hexdigest()

res = verfication(name_input)

# res = True

if res :

# 证明用户还没有存在可以注册

with open('user_data.txt','ab') as f:

pickle.dump({'name':name_input,'password':password_input},f)

pickle.dump('\n',f)

print('注册成功')

else:

pass

def verfication(name_input):

import pickle

with open('user_data.txt','rb') as f:

file = r"user_data.txt"

# f = open(file, 'rb')

count = len(open(file, 'rb').readlines())

for line in range(count-1) :

line = pickle.load(f)

name , password = line['name'],line['password']

# f.close()

if name == name_input:

print('该用户名已经存在')

break

else:

return True

def run():

func_dic = {'0':verfication,

'1':register,

}

while True:

print('1注册,q退出')

choice = input('请输入').strip()

if choice == 'q':

break

func_dicchoice

run()

def register():
import hashlib
name_input = hashlib.md5(input('input your name').encode('utf-8'))
password_input = hashlib.md5(input('input your password').encode('utf-8'))
with open(r'date.txt', 'rt', encoding='utf-8') as f:
for line in f:
line = line.rstrip('\n')
name, password = line.split('😂
if name == name_input.hexdigest():
print('该用户已经存在')
else:
with open(r'date.txt', 'at', encoding='utf-8') as f2:
f2.write(name_input.hexdigest())
f2.write('😂
f2.write(password_input.hexdigest())
f2.write('\n')
print('注册成功')

def login():
import hashlib
name_input = hashlib.md5(input('input your name').encode('utf-8')).hexdigest()
password_input = hashlib.md5(input('input your password').encode('utf-8')).hexdigest()
with open(r'date.txt','rt',encoding='utf-8') as f:
for line in f:
line = line.strip()
name , password = line.split('😂
if name == name_input and password == password_input:
print('login!')
break
else:
print('账户或密码错误')

def run():
user_list = ['1.注册','2.登录','q推出']
limits = ['1','2']
user_dic = {
'1':register,
'2':login
}
while True:
for i in user_list:
print(i)
user_input = input('>>>')
if user_input.lower() == 'q':
break
if user_input not in limits:
print('请输入正确的指令')
else:
user_dicuser_input

run()

json,pickle模块===================================================

将python'中所有的数据类型转换成字节串,序列化过程
将字节串装换成python中的数据类型,称为反序列化过程
"""
import pickle

所有的数据类型都可以进行序列化

bys = pickle.dumps([1,2,3])

bys = pickle.dumps((1,2,3))

print(type(bys))

print(bys)

res = pickle.loads(bys)

print(type(res))

bys = pickle.dumps(set('abc'))

res = pickle.loads(bys)

print(res.class)

多次pickle序列化的内容写入文件中

with open('d.txt',mode='ab') as f:
pickle.dump({"alex":"123"},f)
pickle.dump('\n',f)
# pickle.dump('12345\n',f)

从文件中反序列化pickle数据

with open('d.txt','rb') as f:
file=r"d.txt"
count=len(open(file,'rb').readlines())
print(count)
for x in range(count):
print(pickle.load(f).class)

pickle最常用的场景是一次性写入一次读取和json一样

json , pickle的比较:

"""
1.json:不是所有的数据类型都可以序列化('字符串'),反序列化不一定能还原成当初的数据格式
2.不能多次对同一个文件进行序列化,但是可以用f.write(json.dump())的方式多次序列化
3.json数据可以跨语言
"""

pickle:
1.所有的python数据类型都能序列化,结果都是字符
2.可以多次对同一个文件序列化
3.不能夸语言,java,c++不能识别pickle序列化得到是对象

什么是序列化:
把结构化的数据拆分成字节的形式,可以通过网络进行跨语言传输或储存在文件中的过程叫序列化
从文件中或网络中获取的被序列化的数据在转换成为原来的形式,原来的数据类型称为反序列化

collection模块

collections模块
namedtuple():命名元祖
defaultdict():默认值字典
Counter():计数器
"""

import collections

from collections import *

通过属性房屋元祖的属性

namedtuple()

Rectangle = namedtuple('Rectangle_class',['length','width'])

r = Rectangle(10,5)

print(r.length)

print(r.width)

print(r)

默认字典

defaultdict:

defaultdict()

d = defaultdict(int,name='andy',age=10)

print(d['name'],d['age'])

print(d['male'])

print(d)

自定义函数充当第一个参数:

自定义函数不能有参数

def func():

return 369

d = defaultdict(func,name='alex',age=18)

print(d['name'])

print(d['male'])

Counter计数器

r = Counter('aaabbccdde')

print(r.items())

print(r.most_common(3))

字典生成式

new_dic =

print(new_dic)

posted @ 2021-11-05 10:01  Edendd  阅读(81)  评论(0)    收藏  举报
动态线条
动态线条end