Python菜鸟编程第九课之时间、序列化模块
1.Time模块
用法:导入time模块即可。
import time
time中的常用函数:
函数名 | 描述 |
---|---|
time.sleep(n) | 线程推迟指定的时间运行,单位秒 |
time.time() | 返回当前时间戳,表示的是从1970-01-01 00:00:00 开始按秒计算的偏移量 |
time.localtime(sec) | 加一个时间戳转化为一个当前时区的struct_time(默认为当前时间) |
time.gmtime(sec) | 将一个时间戳转化为UTC时区的struct_time(默认为当前时间) |
time.mktime(t) | 将time.struct_time转化为时间戳 |
time.asctime(t) | 将表时间的元组或struce_time表示为:“Sun July 09:06:35 2019”;默认为time.localtime() |
time.ctime(t) | 把一个时间戳转化为time.asctime()的形式。如果未传参,默认time.time() |
time.strftime(format[,t]) | 把一个代表时间的元组struct_time(localtime()、gmtime())转化为格式化的字符串,默认为time.localhost()) |
time.strptime() | 将结构化字符串转化为strct_time形式 |
在Python中,表示时间通常有3种方式。
- 时间戳(time.time()),机器识别的。
- 格式化的时间字符串(format string),人类可以看的。
python中时间日期格式化符号 | 描述 |
---|---|
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%M | 分钟数(00=59) |
%S | 秒(00-59) |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M.或P.M.的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |
%% | %号本身 |
- 结构化的时间(struct_time),返回一个有9个元素的元组(年,月,日,时,分,秒,一年的第几周,一年的第几天,夏令时)对时间操作。
demo1:
#time.time()
import time
print(time.time())
运行结果:
1564102854.4548235
demo2:
import time
nowtime=time.time()
print(nowtime)
print(time.gmtime(nowtime))#UTC时间,0时区
print(time.localtime())#当地时间
运行结果:
1564103927.8606992
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=1, tm_min=18, tm_sec=47, tm_wday=4, tm_yday=207, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=9, tm_min=20, tm_sec=26, tm_wday=4, tm_yday=207, tm_isdst=0)
demo3:
#时间形式的相互转换
tp=time.localtime()
print(tp)
print(time.mktime(tp))#结构化时间转化为时间戳
print(time.strftime('%Y-%m-%d %X',tp))#结构化时间转化为字符串时间格式
print(time.strptime('2019-07-26 09:27:29','%Y-%m-%d %H:%M:%S'))#将字符串格式时间转化为结构化时间
print(time.asctime(tp))
print(time.ctime())#把时间戳转化为asctime()的形式
运行结果:
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=9, tm_min=27, tm_sec=29, tm_wday=4, tm_yday=207, tm_isdst=0)
1564104449.0
2019-07-26 09:27:29
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=9, tm_min=27, tm_sec=29, tm_wday=4, tm_yday=207, tm_isdst=-1)
Fri Jul 26 09:27:29 2019
Fri Jul 26 09:27:29 2019
2.Datatime模块
相对于time模块来说,datetime模块更加直观,容易调用
函数名 | 描述 |
---|---|
datetime.date | 表示日期(类),常用属性year,month,day |
datetime.time | 表示时间(类),常用属性hour,minute,second,microsecond |
datetime.datetime | 表示日期 |
datetime.timedelta | 表示时间间隔 |
datetime.tzinfo | 与时区有关的信息 |
demo1:
import datetime
print(datetime.datetime.now())
print(datetime.datetime.now().date())
print(datetime.datetime.now().time())
运行结果:
2019-07-26 10:07:03.128478
2019-07-26
10:07:03.128478
demo2:
import datetime
print(datetime.datetime.now()+datetime.timedelta(-1))#当前时间减一天
print(datetime.datetime.now()+datetime.timedelta(hours=1))#当前时间加一个小时
运行结果:
2019-07-25 10:46:48.617439
2019-07-26 11:46:48.617439
3.Sys模块
sys模块是与Python解释器交互的一个接口。
demo:
- 在任意一个文件夹中新建一个test1.py的文件
- 在test1.py中输入:
def foo():
print('ss')
在运行文件中输入:
sys.path.append('D:/PyCharm/BClass/PXClass/2019-7-25')#这里添加的是test1.py的文件
# test1.foo
print(sys.path)
import test1
test1.foo()
运行结果:
['D:\\PyCharm\\BClass\\PXClass\\2019-7-26', 'D:\\PyCharm\\BClass', 'D:\\anaconda\\anaconda\\python37.zip', 'D:\\anaconda\\anaconda\\DLLs', 'D:\\anaconda\\anaconda\\lib', 'D:\\anaconda\\anaconda', 'D:\\anaconda\\anaconda\\lib\\site-packages', 'D:\\anaconda\\anaconda\\lib\\site-packages\\win32', 'D:\\anaconda\\anaconda\\lib\\site-packages\\win32\\lib', 'D:\\anaconda\\anaconda\\lib\\site-packages\\Pythonwin', 'D:\\PyCharm\\PyCharm 2018.2.3\\helpers\\pycharm_matplotlib_backend', 'D:/PyCharm/BClass/PXClass/2019-7-25']
ss
demo:
import sys
print(sys.byteorder)#显示本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little'
print(sys.copyright)#显示记录python版权相关的东西
print(sys.executable)#显示python解释器在磁盘上的路径
print(sys.getfilesystemencoding())#当前系统上保存文件使用的字符集
print(sys.maxsize)#显示Python中支持的最大整数
print(sys.platform)#显示当前Python所在平台
print(sys.version)#返回当前Python解释器的版本信息
运行结果:
little
Copyright (c) 2001-2018 Python Software Foundation.
All Rights Reserved.
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
D:\anaconda\anaconda\python.exe
utf-8
9223372036854775807
win32
3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]
4.序列化模块
概念:将一个对象从内存转化为可储存(字符串类型)或者可传输(bytes)类型的过程。
Python中交pickling.
为什么要是有序列号?
- 跨久化数据使用
- 跨平台交互使用
- 使程序更容易维护
4.1Json
json格式在各个语言中都可以通用序列号格式。在json中,所有字符串必须为“”。
Json类型 | Python类型 |
---|---|
{} | dict |
[] | list |
“string” | str |
1234.56 | int/float |
true/false | Trur/False |
null | None |
json优缺点:
优点 | 缺点 |
---|---|
所以的数据类型是各语言通用的 | json只支持列表,字典,数值,字符串和布尔值 |
对数据要求非常严格 | |
key值必须是可哈希 |
四个功能:
- dumps。json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)
- dump。把数据类型转换成字符串并存储在文件中
- loads。json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典)
- load。把文件打开从字符串转换成dict数据类型
demo1:
如果是元组,序列化是强转为列表,若元组为字典的键,序列化时报错。
#序列号
import json
dic={'name':'city','age':180}
sr_dic=json.dumps(dic)¥=#序列化,将字典转换为字符串
print(type(sr_dic))
print(sr_dic)
print(dic)
d1={'seq':(1,2,3)}
s_d1=json.dumps(d1)#会将字典中元组自动转为列表
print(s_d1)
运行结果:
<class 'str'>
{"name": "city", "age": 180}
{'name': 'city', 'age': 180}
{"seq": [1, 2, 3]}
demo2:
#反序列化
dic_2=json.loads(sr_dic)
print(type(dic_2))
print(dic_2)
运行结果:
<class 'dict'>
{'name': 'city', 'age': 180}
如果把数据类型直接序列化写入文件中,可以用dump和load
demo3:
import json
dic={'name':'city','age':180}
with open('dump_json.txt','w')as f:
json.dump(dic,f)#dump方法可以接收一个文件句柄。直接将字典转换成字符串,写入文件中
with open('dump_json.txt','r')as f:
ret=json.load(f)
print(ret,type(ret))
运行结果:
{'name': 'city', 'age': 180} <class 'dict'>
4.2Pickle
pickle只用于Python。
内存中结构化的数据,格式pickle,bytes类型,保存在文件或基于网络网络传输
pickle优缺点:
优点 | 缺点 |
---|---|
支持Python中的几乎所有类型 | 只支持Python |
pickle会把数据类型序列化成bytes类型 |
模块提供的四个功能:
-
序列化:
dumps。pickle.dumps()函数是将一个Python数据类型列表进行pickle格式的编码(可以这么理解,pickle.dumps()函数是将字典转化为二进制数据)
dump。把数据类型转换成二进制并存储在文件中
-
反序列化:
loads。pickle.loads()函数是将pickle格式数据转换为字典(可以这么理解,pickle.loads()函数是将二进制数据转化为字典)
load。把文件打开从二进制转换成dict数据类型
demo1:
import pickle
dic={'name':'city','age':20}
d_b=pickle.dumps(dic)#序列化
print(type(d_b))
print(d_b)
d1=pickle.loads(d_b)#反序列化
print(type(d1))
print(d1)
运行结果:
<class 'bytes'>
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00cityq\x02X\x03\x00\x00\x00ageq\x03K\x14u.'
<class 'dict'>
{'name': 'city', 'age': 20}
demo2:
#因为是二进制文件操作,所以,打开文件时的权限都应该加b
import pickle
dic={'name':'city','age':20}
with open('picktest.txt','wb') as f:
pickle.dump(dic,f)
with open('picktest.txt','rb') as f:
qq=pickle.load(f)
print(qq,type(qq))
运行结果:
{'name': 'city', 'age': 20} <class 'dict'>