好用的内置模块Ⅱ

时间:2019-06-28 20:51:09   收藏:0   阅读:90

一, shelve模块

  1. shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些,
    shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似

    import shelve
    f = shelve.open('shelve_file')
    f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接对文件句柄操作,就可以存入数据
    f.close()
    
    import shelve
    f1 = shelve.open('shelve_file')
    existing = f1['key']  #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    f1.close()
    print(existing)
  2. 这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作.所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读方式打开DB

    import shelve
    f = shelve.open('shelve_file', flag='r')
    existing = f['key']
    f.close()
    print(existing)
  3. 由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存

    import shelve
    f1 = shelve.open('shelve_file')
    print(f1['key'])
    f1['key']['new_value'] = 'this was not here before'
    f1.close()
    
    f2 = shelve.open('shelve_file', writeback=True)
    print(f2['key'])
    f2['key']['new_value'] = 'this was not here before'
    f2.close()
  4. writeback方式有优点也有缺点.优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间.因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入.

二, time模块

  1. 在python中,通常有三种方式来表示时间:

    • 时间戳(times tamp): 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是float类型

      import time
      t = time.time()
      print(t)
    • 格式化的时间字符串(format time):

      import time
      t1 = time.strftime('%Y-%m-%d %H:%M:%S') # 必须是ascii码支持的
      print(t1)  # 2019-06-28 19:04:00
      ------------------------------------------------
      t2 = time.strftime('%Y{}%m{}%d{} %H:%M:%S')
      t3 = t2.format('年', '月', '日')
      print(t3)  # 2019年06月28日 19:04:00
      %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):

      t = time.localtime()
      print(t)
      # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=19, tm_min=12, tm_sec=59, tm_wday=4, tm_yday=179, tm_isdst=0)
    • 小结: 时间戳是计算机能够识别的时间;格式化时间字符串是人能够看懂的时间;结构化元组时间则是用来操作时间的

  2. 几种格式之间的转换

    import time
    # 格式化时间--->结构化时间
    ft = time.strftime('%Y-%m-%d %H:%M:%S')
    st = time.strptime(ft, '%Y-%m-%d %H:%M:%S') # 此处格式必须与上方相同
    print(st)
    # 结构化时间--->时间戳
    t = time.mktime(st)
    print(t)
    # 时间戳--->结构化时间
    t = time.time()
    st = time.localtime(t)
    print(st)
    # 结构化时间--->格式化时间
    ft = time.strftime('%Y-%m-%d %H:%M:%S', st)
    print(ft)
    #结构化时间 --> %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' 
    
    t = time.time()
    ft = time.ctime(t)
    print(ft)
    
    st = time.localtime()
    ft = time.asctime(st)
    print(ft)
  3. 计算时间差

    t1 = '2017-09-11 08:30:00'
    t2 = '2019-05-11 08:50:00'
    st1 = time.strptime(t1, '%Y-%m-%d %H:%M:%S')
    st2 = time.strptime(t2, '%Y-%m-%d %H:%M:%S')
    tt1 = time.mktime(st1)
    tt2 = time.mktime(st2)
    time_dif = tt2 - tt1
    struct_time = time.localtime(time_dif)
    print(struct_time)
    print(f'过去了{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}秒')

三, datetime模块

import datetime
now_time = datetime.datetime.now()
# 现在的时间2019-06-28 19:47:21.339993
--------------------------------------------------
# 只能调整的字段: week days hours minutes seconds
print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前
print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前
print(datetime.datetime.now() + datetime.timedelta(days=3)) # 三天后
print(datetime.datetime.now() + datetime.timedelta(hours=5)) # 5小时后
print(datetime.datetime.now() + datetime.timedelta(hours=-5)) # 5小时前
print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分钟前
print(datetime.datetime.now() + datetime.timedelta(minutes=15)) # 15分钟后
print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前
print(datetime.datetime.now() + datetime.timedelta(seconds=70)) # 70秒后
--------------------------------------------------
# 可直接调整到指定的 年 月 日 时 分 秒 等
now_time = datetime.datetime.now()
print(current_time.replace(year=1977))  # 直接调整到1977年
print(current_time.replace(month=1))  # 直接调整到1月份
print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601
--------------------------------------------------
# 将时间戳转化成时间
print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17

四, random模块

import random
# 随机小数
random.random()  # 大于0且小于1之间的小数
random.uniform(1, 3) # 大于1小于3的小数
# ----------------------------------------
# 随机整数
random.randint(1, 5) # 大于等于1且小于等于5之间的整数
random.randrange(1, 10, 2) # 大于等于1且小于10之间的奇数
# ----------------------------------------
# 随机选择一个返回
random.choice([1, '23', [4, 5]])  # 1或者23或者[4,5]

# 随机选择多个返回
random.sample([1, '23', [4, 5]], 2) # 列表元素任意2个组合
# ----------------------------------------
# 打乱列表顺序
lst = [1, 2, 3, 4, 5, 6]
random.shuffle(lst)
print(lst) # 随机顺序
# 模拟随机验证码
import random
def v_code():
    code = ''
    for i in range(5):
        num = random.randint(0, 9)
        alf = chr(random.randint(65, 90))  # chr()通过序号查字符
        add = random.choice([num, alf])
        code = "".join([code, str(add)])
    return code

print(v_code())
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!