常用模块

一. time模块

# 字符串数据类型    (格式化时间)-给人看的
# 2018-08-20 16:42:53

# 结构化时间(共有9个元素)
# (tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=42, tm_sec=53, tm_wday=0, tm_yday=232, tm_isdst=0)
# (年, 月, 日, 时, 分, 秒, 一周的第几天(0-6,0表示周一), 一年中的第几天, 夏令时(默认0))

# 浮点型数据类型,以秒(S)为单位 (时间戳时间)-给机器计算用的
# 时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
# 1534754573.2385244

import tim
-----------我们先以当前时间为准,让大家快速认识三种形式的时间
print(time.time()) # 时间戳:1534754573.2385244
print(time.strftime("%Y-%m-%d %X"))  # 结构化时间:2018-08-20 16:42:53
 
print(time.localtime())  #本地时区的struct_time
print(time.gmtime())    #UTC时区的struct_time

===================================几种格式之间的转换======================================

时间戳换成字符串时间
struct_time = time.localtime(1534754573.2385244)
print(struct_time)                       # 北京时间
print(time.gmtime(1534754573.2385244))   # 伦敦时间
ret = time.strftime('%Y-%m-%d %H:%M:%S',struct_time)
print(ret)



结果:
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=42, tm_sec=53, tm_wday=0, tm_yday=232, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=8, tm_min=42, tm_sec=53, tm_wday=0, tm_yday=232, tm_isdst=0)
2018-08-20 16:42:53

字符串时间转成时间戳
struct_time = time.strptime('2018-08-20 16:42:53','%Y-%m-%d %H:%M:%S')
ret = time.mktime(struct_time)
print(ret)

结果:
1534754573.0

2018-8-19 22:10:8   2018-8-20 11:07:3
经过了多少时分秒

true_time = time.mktime(time.strptime('2018-8-19 22:10:8', '%Y-%m-%d %H:%M:%S'))
time_now = time.mktime(time.strptime('2018-8-20 11:07:3', '%Y-%m-%d %H:%M:%S'))
dif_time = time_now - true_time
struct_time = time.gmtime(dif_time)
print('过去了%d年%d月%d天%d小时%d分钟%d秒' % (struct_time.tm_year - 1970, struct_time.tm_mon - 1,
                                   struct_time.tm_mday - 1, struct_time.tm_hour,
                                   struct_time.tm_min, struct_time.tm_sec))

str_time1 = '2018-8-19 22:10:8'
str_time2 = '2018-8-20 11:07:3'
struct_t1 = time.strptime(str_time1,'%Y-%m-%d %H:%M:%S')   # 转成结构化时间
struct_t2 = time.strptime(str_time2,'%Y-%m-%d %H:%M:%S')
timestamp1 = time.mktime(struct_t1)    # 转成时间戳时间
timestamp2 = time.mktime(struct_t2)
sub_time = timestamp2 - timestamp1    # 计算差
gm_time = time.gmtime(sub_time)  # 把差值转成伦敦时间
# 1970-1-1 00:00:00
print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(gm_time.tm_year-1970,gm_time.tm_mon-1,
                                 gm_time.tm_mday-1,gm_time.tm_hour,
                                 gm_time.tm_min,gm_time.tm_sec))
计算时间差
import datetime

print(datetime.datetime.now())  # 返回 2016-08-19 12:47:03.941925
print(datetime.date.fromtimestamp(time.time()))  # 时间戳直接转成日期格式 2016-08-19
print(datetime.datetime.now() + datetime.timedelta(3))  # 当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(-3))  # 当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3))  # 当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30))  # 当前时间+30分


c_time = datetime.datetime.now()
print(c_time.replace(minute=3, hour=2))  # 时间替换
datetime模块

二.random模块

import random

取随机小数
print(random.random())  # 取0-1之间的小数
print(random.uniform(1, 2))  # 取一个范围内的小数

取随机整数
print(random.randint(1, 2))  # 取范围内的一个整数(可顾头顾尾)
print(random.randrange(1, 5))  # 取范围内的一个整数(不顾尾)不会取末尾数
print(random.randrange(1, 100, 2))  # 可以给范围内加一个步长参数,1-100的奇数随机取

从一个列表中随机抽取
lst = ['a', 'b', 'c', (1, 2, 3), 456]
print(random.choice(lst))  # 从列表中随机返回一个元素
print(random.sample(lst, 2))  # 从列表中随机返回多个,返回的个数为函数的第二个参数(返回的是列表)

打乱列表的顺序, 在原列表的基础上直接进行修改,节省空间
lst = ['a', 'b', 'c', (1, 2, 3), 456]
random.shuffle(lst)
print(lst)

def code(n=6):
    s = ''
    for i in range(n):
        num = str(random.randint(0, 9))
        alpha_upper = chr(random.randint(65, 90))
        alpha_lower = chr(random.randint(97, 122))
        ret = random.choice((num, alpha_upper, alpha_lower))
        s += ret
    return s


print(code())
生成随机验证码

三.os模块

os模块是与操作系统交互的一个接口

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.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd


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的大小(字节)

def func(path):
    size_sum = 0
    name_lst = os.listdir(path)
    for name in name_lst:
        path_abs = os.path.join(path,name)
        if os.path.isdir(path_abs):   # 判断是否是一个文件夹
            size = func(path_abs)
            size_sum += size
        else:
            size_sum += os.path.getsize(path_abs)
    return size_sum
ret = func(r'文件夹的路径')
print(ret)
统计一个文件夹大小

四.序列化模块

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

  dumps  序列化.   把对象转化成bytes
  loads 反序列化. 把bytes转化成对象
  dump 序列化. 把对象转化成bytes并写入文件
  load 反序列化. 把文件中的bytes读取,并转化成对象

import pickle

class
Cat: def __init__(self, name, age): self.name = name self.age = age def catchMouse(self): print(self.name, self.age, '抓老鼠') c = Cat('Jerry',18) # dumps 把对象转化成bytes 序列化 bs = pickle.dumps(c) print(bs) # b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x05\x00\x00\x00Jerryq\x04X\x03\x00\x00\x00ageq\x05K\x12ub.' # 把bytes转回对象 反序列化 cc = pickle.loads(bs) cc.catchMouse() dic = {'a':'钢铁侠','b':'蝙蝠侠','c':'煎饼侠'} bs = pickle.dumps(dic) print(bs) # b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01X\t\x00\x00\x00\xe9\x92\xa2\xe9\x93\x81\xe4\xbe\xa0q\x02X\x01\x00\x00\x00bq\x03X\t\x00\x00\x00\xe8\x9d\x99\xe8\x9d\xa0\xe4\xbe\xa0q\x04X\x01\x00\x00\x00cq\x05X\t\x00\x00\x00\xe7\x85\x8e\xe9\xa5\xbc\xe4\xbe\xa0q\x06u.' dd = pickle.loads(bs) print(dd) # {'a': '钢铁侠', 'b': '蝙蝠侠', 'c': '煎饼侠'} class Cat: def __init__(self, name, age): self.name = name self.age = age def catchMouse(self): print(self.name, self.age, '抓老鼠') c = Cat('Jerry',18) f = open('pickle_test',mode='wb') pickle.dump(c,f) # 写入文件中的内容是看不了的 f.close() f = open('pickle_test',mode='rb') cc = pickle.load(f) cc.catchMouse() # Jerry 18 抓老鼠 lst = [Cat("猫1", 50), Cat("猫2", 40), Cat("猫3", 30), Cat("猫4", 20), Cat("猫5", 10)] f = open('pickle_test',mode='wb') pickle.dump(lst,f) f = open('pickle_test',mode='rb') cc = pickle.load(f) for el in cc: el.catchMouse() # 猫1 50 抓老鼠 # 猫2 40 抓老鼠 # 猫3 30 抓老鼠 # 猫4 20 抓老鼠 # 猫5 10 抓老鼠 # 也可以用for循环 f = open('pickle_test',mode='wb') for el in lst: pickle.dump(el,f) f.flush() f.close() f = open('pickle_test',mode='rb') while True: try: c = pickle.load(f) c.catchMouse() except EOFError: break # 猫1 50 抓老鼠 # 猫2 40 抓老鼠 # 猫3 30 抓老鼠 # 猫4 20 抓老鼠 # 猫5 10 抓老鼠

 

 

import json

dic = {'a':'李茶的姑妈','b':'找到你','c':'看不见的客人'}
s = json.dumps(dic)
print(s,type(s))
# {"a": "\u674e\u8336\u7684\u59d1\u5988", "b": "\u627e\u5230\u4f60", "c": "\u770b\u4e0d\u89c1\u7684\u5ba2\u4eba"} <class 'str'>
# 如果key或value超出了ascii码表的范畴,就会显示成\uxxx

ss = json.dumps(dic,ensure_ascii=False)  # ensure_ascii = False 会干掉ascii码
print(ss,type(ss))
# {"a": "李茶的姑妈", "b": "找到你", "c": "看不见的客人"} <class 'str'>


# 把字符串解析成 字典
dic = json.loads(ss)
print(dic,type(dic))
# {'a': '李茶的姑妈', 'b': '找到你', 'c': '看不见的客人'} <class 'dict'>

# 写入
f = open("电影.json", mode="w", encoding="utf-8")
json.dump(dic, f, ensure_ascii=False)   # 把json写入到文件中
f.close()

# 读出
f = open("电影.json", mode="r", encoding="utf-8")
s = json.load(f) # 把文件中的json串。读取成字典
print(s, type(s))
# {'a': '李茶的姑妈', 'b': '找到你', 'c': '看不见的客人'} <class 'dict'>


lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}]
f= open('menu.json',mode='w',encoding='utf-8')
for el in lst:
    json.dump(el,f,ensure_ascii=False)
f.close()
f = open('menu.json',mode='r',encoding='utf-8')
print(json.load(f))
# 总结:以上方法读取的时候会报错
# 写入文件的时候,直接一行写入,读取的时候无法分辨写入几个字典

# 解决方案
# 写入的时候
#     1.循环
#     2.用dumps把字典转化成字符串,然后手动在湖面加一个\n
#     3.写出
lst = [{"a": "胡辣汤"}, {"b": "吱吱冒油的大猪蹄子"}, {"c": "盖浇饭"}, {"d": "马拉"}, {"e": "法国大蜗牛"}]
f = open('new_menu.json', mode='w', encoding='utf-8')
for el in lst:
    s = json.dumps(el,ensure_ascii=False)+'\n'
    f.write(s)

# 读取的时候
#     1.循环
#     2.strip() 去掉换行
#     3. loads() 变成字典

f = open('new_menu.json',mode='r',encoding='utf-8')
for line in f:
    line = line.strip()
    dic = json.loads(line)
    print(dic)
# {'a': '胡辣汤'}
# {'b': '吱吱冒油的大猪蹄子'}
# {'c': '盖浇饭'}
# {'d': '马拉'}
# {'e': '法国大蜗牛'}

 

posted @ 2018-08-22 21:34  一纸休书  阅读(125)  评论(0编辑  收藏  举报