主要内容:
1 : 时间模块
a: 时间戳时间 ,格林威治时间, float数据类型 ,给机器用的
英国伦敦时间 1970.1.1 0:0:0
北京时间 1970.1.1 8:0:0
time.time() 获取时间戳时间
import time print(time.time())
b: 结构化时间,时间对象,能够通过.属性名来获取对象中的值.
time.localtime() 获取结构化时间
struct_time = time.localtime() print(struct_time) #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=2, tm_yday=220, tm_isdst=0)
c: 格式化时间: 字符串时间, str数据类型,给人看的
time.strftime() 获取格式化时间
struct_time = time.localtime() print(struct_time) #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=2, tm_yday=220, tm_isdst=0)
d: 三种模式之间的转换
1) 格式化时间--> strptime('格式化时间','%Y-%m-%d') <--结构化时间<-- mktime(结构化时间) -->时间戳时间
import time formatstring = time.strftime('%y-%m-%d') struct_time = time.strptime(formatstring,'%y-%m-%d') timestamp = time.mktime(struct_time) print(timestamp)
2) 时间戳时间--> localtime(timestamp)<--结构化时间-->strftime('时间格式',格式化时间)
import time timestamp = time.time() struct_time = time.localtime(timestamp) print(struct_time) formatsring = time.strftime('%y-%m-%d',struct_time) print(formatsring)
e: 一道题:计算本地一月的时间戳时间
import time formatstring = time.strftime('%y-%m-1') struct_time = time.strptime('formatstring','%y-%m-%d') timestamp = time.mktime(struct_time) print(timestamp)
第二种方法:
import time struct_time = time.localtime() struct_time = time.strptime('%s-%s-1' % (struct_time.tm_year,struct_time.tm_mon),'%Y-%m-%d') timestamp = time.mktime(struct_time) print(timestamp)
2 . sys模块 :跟python解释器打交道的(sys模块是与python解释器交互的一个接口)
a: sys.platform :返回操作系统平台名称
b: sys.exit() 退出程序
import sys #跟python解释器打交道的 print(sys.platform) #操作平台win32 sys.exit() #结束程序再写print会报错 print(123)
c: sys.argv : 命令行参数list
1) :返回一个列表
第一个元素, 是执行这个文件的时候, 写在python命令后面的第一个值,
之后的元素,在执行python的启动的时候可以写多个值, 都会被依次添加到列表中.
2): 用处
name = sys.argv[1] pwd = sys.argv[2] if name == 'alex' and pwd == 'alex3714': print('执行以下代码') else: exit()
3 . os模块
a: 创建和删除文件夹
创建文件夹:
import os os.mkdir('dir') # ftp 网盘 生成单级文件夹 os.mkdir('dir/dir5') # ftp 网盘 os.makedirs('dir2/dir3/dir4',exist_ok=True) 生成多级文件夹
删除文件夹:
os.remove('dir2/dir3/dir4/aaa.py') 删除文件 os.rmdir('dir2/dir3/dir4') 不能删除一个非空文件夹 ,删除单级文件夹 os.removedirs('dir2/dir3/dir4') 递归向上删除文件夹,只要删除当前目录之后 发现上一级目录也为空了,就把上一级目录也删掉. 如果发现上一级目录有其他文件,就停止
b: os.listdir: 列出指定目录下的所有文件和子目录,并以列表方式打印.
import os print(os.listdir(r'C:Users26897PycharmProjectsuntitledWorkspace')) # ['day 20', 'day 02', 'day 21 反射', 'day01', 'day03', 'day04', 'day05', 'day06', 'day07', 'day08', 'day09', 'day10', 'day11考试', 'day12', 'day13',
'day14', 'day15', 'day16 类,对象调用类中的变量和方法', 'day17 类,对象的查询空间,组合', 'day18 继承,单,多继承;新式类,经典类', 'day22 考试', 'day23', 'day24', '
day25 正则表达式', 'day26', 'day27', '作业', '学生选课']
c :
import os print(os.stat(r'C:Users26897PycharmProjectsuntitledWorkspaceday25 正则表达式练习.py')) #获取文件目录信息 print(os.sep) # 当前你所在的操作系统的目录分割符 /a/dir/dir2 print([os.linesep]) #输出当前平台使用的行终止符,win下为" ",Linux下为" " print(os.pathsep) # 输出用于分割文件路径的字符串 win下为;,Linux下为: print(os.name) # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
d: print(os.environ) :获取系统环境变量
e: os.path.dirname(path) # 返回path的上一级目录,即是os.path.split(path) 的第一个元素
os.path.dirname(path) # 返回path的上一级目录,即是os.path.split(path) 的第一个元素 print(os.path.dirname(r'C:Users26897PycharmProjectsuntitledWorkspaceday27')) #返回path的上一级目录,即是os.path.split(path) 的第一个元素
f: os.path.split(path) # 将path分割成目录和文件名二元组返回,
# print(os.path.split(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py')) # print(os.path.split(r'C:Users26897PycharmProjectsuntitledWorkspaceday27'))
h: os.path.isfile(path) #判断path是不是一个存在的文件,如果是返回ture,否则false
os.path.isdir(path) #判断path是不是一个存在的目录,如果是返回ture,否则false
import os print(os.path.isfile(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py')) #ture print(os.path.isdir(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py')) #false print(os.path.isdir(r'C:Users26897PycharmProjectsuntitledWorkspaceday27')) #ture
g: os.path.join() #将多个路径组合后返回,(第一个绝对路径之前的参数将被忽略.)
import os ret = os.path.join(r'C:Users26897PycharmProjectsuntitledWorkspaceday27','aaa','bbb') print(os.path.abspath(ret)) # C:Users26897PycharmProjectsuntitledWorkspaceday27aaabb
l: os.path.getsize(path) 返回path的大小
import os
print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py')) #428
print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday24')) #4096
print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday23')) #4096
#文件夹都是4096字节,所有的都一样,文件大小精确统计
m : os.path.exist() : 判断path是否存在 os.path.isabs() : 判断path是不是决定路径,如果是返回ture
n : os.path.basename(path) : 返回最后一层文件或者目录
print(os.path.basename('D:/sylar/python_workspace/day25')) #day25 print(os.path.basename('D:/sylar/python_workspace/day25/5.os模块.py')) #5.os模块.py
4 . 序列化 : 把原本的字典 , 列表等内容转换成字符串的过程.
a : 为什么要序列化 : 要把内容写入文件 , 网络传输数据
b :反序列化 : 字符串 --> 字典,列表 , 数字 , 对象
c : json 的四个方法 :jumps loads jump load
1) json . jumps jumps.loads
dic = {'aaa':'bbb','ccc':'ddd'} str_dic = json.dumps(dic) print(str_dic) #{"aaa": "bbb", "ccc": "ddd"} 将字典转转换成字符串 print([str_dic]) #['{"aaa": "bbb", "ccc": "ddd"}'] 注意,json转换完的字符串类型的字典中的字符串是由""表示的 with open('json_dunp','w')as f: f.write(str_dic) ret = json.loads(str_dic) #反序列化: 将一个字符串格式的字典转换成一个字典 print(ret) #{'aaa': 'bbb', 'ccc': 'ddd'} 注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
2) json. jump, json. load
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
3) json 限制问题
@ json格式的限制1,json格式的key必须是字符串数据类型,如果是数字为key,那么dump之后会强行转成字符串数据类型
import json dic = {1:2,3:4} str_dic = json.dumps(dic) print(str_dic) #{"1": 2, "3": 4} new_dic = json.loads(str_dic) print(new_dic) #{'1': 2, '3': 4}
@ json是否支持元祖作为key : 不支持
dic = {(1,2,3):3, ('a','b','c'):4} str_dic1 = json.dumps(dic) print(str_dic1) #keys must be a string
@ json是否支持元祖作为value :支持,会把value转变成列表
dic = {3:(1,2,3), 4:('a','b','c')} str_dic1 = json.dumps(dic) #{"3": [1, 2, 3], "4": ["a", "b", "c"]} print(str_dic1) new_dic1 = json.loads(str_dic1) #{'3': [1, 2, 3], '4': ['a', 'b', 'c']} print(new_dic1)
@ 对列表的dump
import json li = ['ser',1,'a', (1,2,3)] with open('uin','w')as f: json.dump(li,f) with open('uin', 'r')as f: json.load(f) print(li, type(li))
@ 能不能多次dump数据到文件里,可以多次dump但是不能load出来了
import json dic = {1:2,'a':(1,2,4)} lst = ['a', 'b'] with open('str', 'w')as f : json.dump(dic,f) json.dump(lst,f) with open('str','r')as f: json.load(f) #报错
想dump多个数据进入文件,用dumps
import json dic = {1:2,'a':(1,2,4)} lst = ['a', 'b'] str_dic = json.dumps(dic) str_lst = json.dumps(lst) with open('iii','w')as f: f.write(str_dic + ' ') f.write(str_lst + ' ') f.close() with open('iii')as f: for line in f: ret = json.loads(line) print(ret)
@ 中文格式 加了ensure_ascii=false中文就可以原样输出
import json dic = {'a':1,'每天':2} str_dic = json.dumps(dic, ensure_ascii=False) print(str_dic) #{"a": 1, "u6bcfu5929": 2}
@ json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间(ident缩进, ensure_ascii = false显示中文separators分隔符)
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)
@ set不能被dump/dumps
import json set = {2,3,4,'a',9,(2,4,5)} str_set = json.dumps(set) print(str_set) #报错Object of type 'set' is not JSON serializable
d : pickle
dump的结果是bytes, dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式
import pickle dic = {1:2,3:4} str_dic = pickle.dumps(dic) print(str_dic) #b'x80x03}qx00(Kx01Kx02Kx03Kx04u.' new_dic = pickle.loads(str_dic) print(new_dic) #{1: 2, 3: 4}
对于对象的序列化需要这个对象对应的类在内存中
class Student: def __init__(self,name, age): self.name = name self.age = age s = Student('lily',34) str_S = pickle.dumps(s) new_s = pickle.loads(str_S) print(new_s) #<__main__.Student object at 0x000001DE1915D550> print(new_s.name) #lily
对于多次dump/load做了良好的处理.
import pickle with open('pickle_demo','wb') as f: pickle.dump({'k1':'v1'}, f) pickle.dump({'k11':'v1'}, f) pickle.dump({'k11':'v1'}, f) pickle.dump({'k12':[1,2,3]}, f) pickle.dump(['k1','v1','l1'], f) with open('pickle_demo','rb')as f : while 1: try: print(pickle.load(f)) except EOFError: break
e: pickle 和 json 的区别:
json : 有限制 ,字符串, 字典 , 列表, 数字 支持所有语言
pickle: 几乎支持所有的对象.
f : shelve (稍微了解)只有一个方法
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)
# shelve 如果你写定了一个文件
# 改动的比较少
# 读文件的操作比较多
# 且你大部分的读取都需要基于某个key获得某个value