- ############### collections 模块 ################
- # collections 模块,
- # 在内置数据类型的基础上, collections 提供了几个额外的数据类型
- # 1.namedtuple: 生成可以使用名字来访问元素内容的 tuple
- # 2.deque: 双端队列, 可以快速的从另外一侧追加和推出对象
- # 3.Counter: 计数器, 主要用来计数
- # 4.OrderedDict: 有序字典
- # 5.defaultdict: 带有默认值的字典
- from collections import namedtuple
- # 这个实现就是面向对象的思想实现的,
- point = namedtuple('point',['x','y']) # 这是定义了一个类, 有一个类名, 两个属性
- p=point(1,2) # 这是类的实例化
- print(p.x)
- print(p.y)
- # 队列,
- # 在任何语言里面, 队列都是一个非常有地位的数据类型, 就像排队买票,
- # 特点就是先进先出, 和列表不一样, 列表是随意拿里面的元素,
- import queue
- # 栈,
- # 对应的是栈, 先进后出, 就像电梯,
- # 双端队列
- # 可以从两端存取, 这个不常用, 但是队列是非常常用的,
- from collections import deque
- dq = deque()
- dq.append(1)
- dq.append(2)
- dq.append(3)
- print(dq.pop()) # 取出来之后, 队列里面就没有了,
- print(dq.popleft())
- dq.appendleft(4)
- dq.appendleft(5)
- print(dq)
- # 有序字典
- from collections import OrderedDict
- d = dict([('a', 1), ('b', 2), ('c', 3)])
- print(d) # 这是无序的
- od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
- print(od) # 这是有序的
- # 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],
- # 将所有大于 66 的值保存至字典的第一个 key 中,
- # 将小于 66 的值保存至第二个 key 的值中.
- # : {'k1': 大于 66 , 'k2': 小于 66}
- list1 =[11,22,33,44,55,66,77,88,99,90]
- dict1 = {'k1':[],'k2':[]}
- for i in list1:
- if i> 66:
- dict1['k1'].append(i)
- elif i <66:
- dict1['k2'].append(i)
- # print(dict1)
- # 使用带有默认值的字典来解决上面的问题,
- from collections import defaultdict
- dict2 = defaultdict(list) # 这是给里面的每一个 key, 创建一个列表, 这里面还可以是集合等其他的类型
- for i in list1:
- if i> 66:
- dict2['k1'].append(i)
- elif i <66:
- dict2['k2'].append(i)
- print(dict2)
- # Counter
- # Counter 类的目的是用来跟踪值出现的次数.
- # 计数值可以是任意的 Interger(包括 0 和负数)
- from collections import Counter
- c = Counter('abcdeabcdabcaba') # 它是一个无序的容器类型, 以字典的键值对形式存储, 其中元素作为 key, 其计数作为 value.
- print(c)
- ############### 时间模块 ################
- # time 模块
- # 在 python 中是经常使用到这个模块的,
- # 比如记录程序执行的时间
- # 让程序停留一段时间 sleep
- # 记住三种时间, 时间戳时间, 格式化时间, 结构化时间, 还有一个 sleep,
- import time
- print(time.time()) # 这是获取当前的时间戳,# 计算时间差使用,
- # time.sleep(3)
- print(time.strftime('%Y-%m-%d %H:%M:%S')) # 字符串格式时间, 给人看的,
- print(time.localtime()) # 结构化时间, 这是格式化时间的基础, 比如计算年和年的差, 月和月的差,
- # 把 2019-12-18 转化成时间戳时间
- # 先转成结构化时间, 必须要这一步, 不能直接格式化时间转换成时间戳时间,
- p=time.strptime('2019-12-17', '%Y-%m-%d')
- print(p)
- # 然后转换成时间戳时间
- print(time.mktime(p))
- # 计算从这个时间到现在过了多少秒了
- print(time.time()-time.mktime(p))
- # 把 1500000000 转成成格式化时间,
- # 先把时间戳时间转换成结构化时间,
- p = time.localtime(1500000000)
- print(p)
- # 把结构化时间转化成格式化时间
- print(time.strftime('%Y-%m-%d %H:%M:%S',p))
- # 时间戳转换成格式化时间, 只有一种格式
- print(time.strftime('%c'))
- print(time.ctime(150000000)) # 为什么是 ctime 就是因为只能转换成 %c 的格式,
- ret = time.localtime(150000000)
- print(time.asctime(ret)) # asctime() 必须传递一个元组,
- # 现在要解决一个问题, 就是如何把时间间隔, 转换成年月日, 比如你入职多久这样的,
- # 比如从 1992-08-16 到今天过了多少年, 多少月, 多少日, 多少时, 多少分, 多少秒了
- # 思路:
- import time
- def time_dif(oldtime,newtime):
- timestamp1 = time.strptime(oldtime,'%Y-%m-%d %H:%M:%S') # strptime 把格式化时间转化成结构化时间
- timestamp2 = time.strptime(newtime,'%Y-%m-%d %H:%M:%S')
- ti = time.localtime(time.mktime(timestamp2)-time.mktime(timestamp1)) # mktime 把结构化时间时间转化成时间戳时间 localtime 把时间戳时间转换成结构化时间
- print(ti)
- return '时间差是 %s 年,%s 月,%s 日,%s 时,%s 分,%s 秒'%(ti.tm_year-1970,ti.tm_mon-1,ti.tm_mday-1,ti.tm_hour,ti.tm_min,ti.tm_sec)
- # 时间戳表示的是从 1970 年 1 月 1 日 00:00:00 开始按秒计算的偏移量
- print(time_dif('1992-8-16 0:0:0','2019-8-18 11:07:3'))
- ############### random 模块 ################
- # random 模块
- import random
- r = random.random() # 生成一个 0-1 之间的小数
- r = random.uniform(1,4) # 生成一个 1-4 之间的小数 , 这个从来没有用过
- r = random.randint(50,100) # 生成一个 50-100 的整数, 用的最多
- r = random.randrange(1,20,2) # 1-20 之间的奇数,
- print(r)
- ############### os 模块 ################
- ############### sys 模块 ################
- # sys 模块
- # 这个是和 python 解释器打交道的,
- import sys
- print(sys.version) # 取 Python 解释程序的版本信息
- print(sys.platform) # 返回操作系统平台名称
- print(sys.path) # 返回模块的搜索路径
- print(sys.argv) # 返回一个列表, 列表的第一项是
- print('*'*6)
- sys.exit() # 退出程序,
- print('-'*6) # 下面的是不会打印执行的,
- # 这个模块完全没有应用场景! 学了和没学一样,
- ############### 序列化模块 ################
- ############### re 模块 ################
- ############### hashlib 模块 ################
- import hashlib
- # 不加盐
- md5 = hashlib.md5() # 创建一个 md5 算法的对象
- md5.update('123456'.encode('utf-8'))
- print(md5.hexdigest()) # 这个值永远不会变, 容易被人暴力破解, 要加盐
- # 固定加盐
- md5 = hashlib.md5('SOS'.encode('utf-8')) # 固定的盐还是可以破解的,
- md5.update('123456'.encode('utf-8'))
- print(md5.hexdigest())
- # 动态加盐
- user = 'sos'
- print(user[1::-1])
- md5 = hashlib.md5(user[1::-1].encode('utf-8'))
- md5.update('123456'.encode('utf-8'))
- print(md5.hexdigest())
- # sha 算法, 和 md5 的用法一样, 不过常用的还是 md5,sha 算法会慢一点
- sha1 = hashlib.sha1('SOS'.encode('utf-8'))
- sha1.update('123456'.encode('utf-8'))
- print(sha1.hexdigest())
- # 文件一致性校验
- def md5file(file):
- md5=hashlib.md5() # 做文件一致性校验不需要加盐
- with open(file,'rb') as f:
- # text = f.read()
- # md5.update(text)
- # 对于大文件, 不能一次性读取,
- while True:
- text = f.read(1024) # 每次读取 1024 字节
- if text:
- md5.update(text)
- else:
- break
- return md5.hexdigest() # 一次性读取和循环读取的结果是一样的
- print('*' * 50)
- print(md5file('test.txt'))
- print(md5file('text2.txt'))
- ############### configparser 模块 ################
- # 配置文件,
- # python 中 INI 结尾, django 中使用 py 文件来用, 学习这个 INI 模式, 保证别人用的时候你能看懂,
- # 在配置文件中必须要有分组,
- # 组名可以随便取, 也可以是 DEFAULT,DEFAULT 有特殊的意义
- # 每一组是一个小节, section, 小节里面的每一项, 叫做 option,
- # 使用 python 创建一个配置文件
- import configparser
- config = configparser.ConfigParser()
- config["DEFAULT"] = {'ServerAliveInterval': '45',
- 'Compression': 'yes',
- 'CompressionLevel': '9',
- 'ForwardX11':'yes'
- }
- config['bitbucket.org'] = {'User':'hg'}
- config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
- with open('example.ini', 'w') as f:
- config.write(f)
- # 查找配置文件
- import configparser # 导入模块
- config = configparser.ConfigParser() # 创建一个对象
- config.read('example.ini') # 读取文件
- print(config.sections()) # 查找所有的小节, default 是不会返回的,
- print('bytebong.com' in config) # False # 判断一个小节是否在配置文件中,
- print('bitbucket.org' in config) # True
- # print(config['bitbucket.org']["user"]) # hg # 取配置文件中某一个小节, 某一个项的值, 字典的操作格式, config[section']["option"]
- # print(config['bitbucket.org']) #<Section: bitbucket.org> 这是一个可迭代对象
- for key in config['bitbucket.org']: # 注意, 有 default 会默认 default 的键, 会把 default 的 key 也打印出来,
- print(key)
- # print(config.options('bitbucket.org')) # 同 for 循环, 找到'bitbucket.org'下所有键
- # print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对
- # print(config.get('bitbucket.org','compression')) # yes
- # get 方法 Section 下的 key 对应的 value. 但是通过任何一个 section 都可以去访问 default 下面的 option
- # 配置文件的修改, 删除, 新增
- import configparser
- config = configparser.ConfigParser()
- config.read('example.ini')
- config.add_section('yuan') # 新增一个 section, 但是记住最后要 write,
- config.remove_section('bitbucket.org')
- config.remove_option('topsecret.server.com',"forwardx11")
- config.set('topsecret.server.com','k1','11111') # K1 有值就是修改 k1 的 value 值, 没有就是添加,
- config.set('yuan','k2','22222')
- config.write(open('new2.ini', "w"))
- ############### logging 模块 ################
- # logging
- # 日志, 用来保持增删查改的记录, 一个记录没有了是没有创建, 还是创建了又删除了, 需要记录日志
- # 有了 log, 就可以使用这个来替代 print 来调试程序, 线上也需要日志来定位错误, 排查问题, 这是必须的,
- # 这些日志都是程序员写出来的, 而且都是要输出到文件的,
- # 使用 logging 日志两种方式
- # 1, 简单配置, 但是受到的局限比较大,
- # 2, 配置 logger 对象,
- # 这两个是独立的,
- # 简单配置
- # 默认情况下只显示警告级别及以上信心
- import logging
- file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
- logging.basicConfig(
- format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
- datefmt='%Y-%m-%d %H:%M:%S',
- handlers=[file_handler,], # 这种简单配置有一个大问题就是不能同时输出到文件和屏幕,
- level=logging.DEBUG # 这样都显示出来了, 但是不能只打印某一种信息, 只能说是打印这个级别以上的信息
- )
- logging.debug('debug message') # 调试模式, 这个级别最低,
- logging.info('info message') # 显示正常的信息
- logging.warning('warning message') # 显示警告信息
- logging.error('error message') # 显示错误信息
- logging.critical('critical message') # 显示严重错误信息
- # 配置 logger 对象, 这是工作中常用的
- import logging
- logger = logging.getLogger() # 实例化一个 logger 对象
- fh = logging.FileHandler('test.log',encoding='utf-8') # 实例化一个文件句柄, 创建一个 handler, 用于写入日志文件
- ch = logging.StreamHandler() # 再创建一个 handler, 用于输出到控制台
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- fh.setLevel(logging.DEBUG)
- fh.setFormatter(formatter)
- ch.setFormatter(formatter)
- ch.setLevel(logging.INFO)
- logger.addHandler(fh) # logger 对象可以添加多个 fh 和 ch 对象
- logger.addHandler(ch)
- logger.debug('logger debug message')
- logger.info('logger info message')
- logger.warning('logger warning message')
- logger.error('logger error message')
- logger.critical('logger critical message')
- ############### 结束线 ################
来源: http://www.bubuko.com/infodetail-3337791.html