一.时间模块:time
使用模块前,先导入模块:import time
常用方法:
time.sleep(secs)
(线程)推迟指定的时间运行,单位为秒
2.时间的应用:
(1)时间戳(timestamp)(格林威治时间)
伦敦时间:1970年1月1日 0:0:0
北京时间:1970年1月1日 8:0:0
time.time() #返回的是float类型 指从1970年1月1日0点开始按计算的便偏移量.
(2)元组(struct_time)结构化时间 (将一个时间转换为当前时间时区的struct_time)
返回的是对象,能够通过 . 属性名来获取对象的值
print(time.localtime()) #结果:time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=21, tm_min=20, tm_sec=55, tm_wday=2, tm_yday=220, tm_isdst=0)
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为0 |
(3)格式化时间
time.strftime('%Y-%m-%d') 结果:2018-08-08
格式化的时间字符串(Formal String):
%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 当前时区的名称 %% %号本身
结论:时间戳是计算机能够识别的,时间字符串(格式化时间)是人能够看懂的时间,元祖(结构化时间)则是用来操作时间的
3.几种格式的相互转化:
(1) 时间戳转结构化时间:
print(time.localtime(1000000)) #当地时间,假如我们在北京执行这个方法,与UTC相差8小时,UTC+8小时 = 北京 结果:time.struct_time(tm_year=1970, tm_mon=1, tm_mday=12, tm_hour=21, tm_min=46, tm_sec=40, tm_wday=0, tm_yday=12, tm_isdst=0)
print(time.gmtime(1000000)) #UTC时间 伦敦时间 结果:time.struct_time(tm_year=1970, tm_mon=1, tm_mday=12, tm_hour=13, tm_min=46, tm_sec=40, tm_wday=0, tm_yday=12, tm_isdst=0)
结构化转化成时间戳
time_tuple = time.localtime(150000) print(time.mktime = (time_tuple)) 结果:150000
结构化时间转换为格式化时间
#time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则现当前时间
print(time.strftime('%Y-%m-%d %H:%M:%S')) 结果:2018-08-08 21:56:56 print(time.strftime('%Y-%m-%d',time.localtime(15000000))) 结果:1970-06-23
格式化时间转换成结构化时间
time.strptime(时间字符串,字符串对应格式) print(time.strptime('2018-08-08','%Y-%m-%d')) 结果:time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=220, tm_isdst=-1) print(time.strptime("07/24/2017","%m/%d/%Y")) 结果:time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
#结构化时间 --> %a %b %d %H:%M:%S %Y串 #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串 >>>time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>>time.asctime() 'Mon Jul 24 15:18:33 2017' #时间戳 --> %a %d %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017'
二.sys模块
sys模块是与python解释器交互的一个接口
sys.path:返回模块的探索路径,初始化时使用PYTHONPATH环境变量的值
sys.modules 用反射时固定写法 getattr(sys.modules[__name__],'变量名')
sys.version :获取python解释程序的版本信息
sys.platform:返回操作系统平台名称
sys.argv 命名参数是list,第一个元素是程序本身
name = argv[1] pwd = argc[2] if name == 'admin' and pwd == '123' print('登录成功') else: exit()
#在pycharm中可以不能用,在cmd中可以用 设置用户名和密码
import sys try: sys.exit(1) except SystemExit as e: print(e)
三.os模块:
os模块是与操作系统交互的一个接口
''' os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 os.path os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。 即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小 '''
os.stat('path/filename')获取文件/目录信息的结构说明
stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
四.序列号模块:
序列化:将原本的字典,列表等内容转换成一个字符串的过程就叫做序列化.
序列化目的
1.以某种存储形式是自定义对象持久化:
2将对象从一个地方传递到另一个地方.
3.是程序更具有维护性
序列化用在哪:
1.把内容写入文件,需要序列化
2.网络传输数据,需要序列化
一共三种模块:
json:
json模块提供四种功能:dumps loads dump load
---dumps---- import json dic = {'k':'v','k1':'v1'} dic_new = json.dumps(dic) #序列化,将一个字典转换成一个字符串 print(dic_new) 结果:{"k": "v", "k1": "v1"} #变成字符串类型,变成了双引号
---loads----
dic2 = json.loads(dic_new) #反序列化,将一个字符串格式的字典转换成一个字典
print(dic2)
结果:{'k': 'v', 'k1': 'v1'} #变回字典类型,变成单引号
也可以处理嵌套的类型:
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
----dump----
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() ---load---- f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)

import json f = open('file','w') json.dump({'国籍':'中国'},f) ret = json.dumps({'国籍':'中国'}) f.write(ret+' ') json.dump({'国籍':'美国'},f,ensure_ascii=False) ret = json.dumps({'国籍':'美国'},ensure_ascii=False) f.write(ret+' ') f.close()
--json的格式化输出--- import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2)

json注意事项: 1.json格式的key必须是字符串数据类型 2.json.load的时候,字符串只能是"" 3.如果是数字为key,那么dump之后会强行转成字符串类型 4.在json中,对元祖做value的字典会把元祖强制转换成列表 5.json不支持key做元祖 6.可以多次dump数据到文件中,但是不能load出来,load会报错 如果想dump多个数据进入文件,用dumps dic = {'abc':(1,2,3)} lst = ['aaa',123,'bbb',12.456]# with open('json_demo','w') as f: str_lst = json.dumps(lst) str_dic = json.dumps(dic) f.write(str_lst+' ') f.write(str_dic+' ') with open('json_demo') as f: for line in f: ret = json.loads(line) print(ret) 7.中文格式的 ensure_ascii = False dic = {'abc':(1,2,3),'country':'中国'} ret = json.dumps(dic,ensure_ascii = False) print(ret) dic_new = json.loads(ret) print(dic_new) with open('json_demo','w',encoding='utf-8') as f: json.dump(dic,f,ensure_ascii=False) json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间 import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) print(json_dic2) 8.set不能被dump/dumps
pickle:
特点:
1.几乎支持所有对象的序列化
2.dump的结果是bytes,dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式
3.对于对象的序列化需要这个对象对应的类在内存中
4.多与多次dump/load的操作做了良好的处理
import pickle dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = pickle.dumps(dic) print(str_dic) #一串二进制内容 dic2 = pickle.loads(str_dic) print(dic2) #字典 import time struct_time = time.localtime(1000000000) print(struct_time) f = open('pickle_file','wb') pickle.dump(struct_time,f) f.close() f = open('pickle_file','rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year)
说明:json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了.
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle
shelve
shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似
import shelve f = shelve.open('shelve_demo') f['key'] = {'k1':(1,2,3),'k2':'v2') f.close() f = shelve.open('shelve_demo') content = f['key'] f.close() print(content) ps:如果你写定一个文件,改动的比较少,读文件的操作比较多, 且你大部分的读取都需要基于某个key获得某个value可以用 shelve