Python--模块

模块的定义:模块就是一个py文件,模块是写好的,但是不能直接使用的功能,使用是需要用import关键字引用
模块分为三种:内置模块、扩展模块、自定义模块
collections模块,在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据
类型:Counter、deque、defaultdict、namedtuple和OrderedDict(有序的字典类型)等。

collections模块
import collections
声明一个有序的字典
t = collections.OrderedDict()#声明t是一个有序的字典
print(t) --->OrderedDict() t的操作和字典的操作一样
t['apple'] = 15
t['orange'] = 12
for i in t:
  print(i)----->输出结果为:apple 15
orange 12 每次运行的时候都是按照这个顺序显示
定义一个默认字典,并且字典的value值是一个列表,如果字典中没好友key,如果key不在默认字典中,则创建一个默认值为[]空列表的key
d = collections.defaultdict(list)#
for value in  values:
if value>66:
if 'k1' in my_dict:
d['k1'].append(value)
else:
d['k1'] = [value]
else:
if 'k2' in my_dict:
d['k2'].append(value)
else:
d['k2'] = [value]
namedtuple我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
命名方式collections.namedtuple('名称',[属性list])
point = collections.namedtuple('point',['x','y'])
p=point(1,2)
print(p.x)----->输出结果为1
deque 双端队列deque除了实现list的append()pop()外,还支持appendleft()popleft()
这样就可以非常高效地往头部添加或删除元素。

q = collections.deque([])
q.append(1)
q.append(2)
q.appendleft('NO1')
print(q)---->deque(['NO1', 1, 2])
 
time 模块:有三种方式来表示时间,时间戳,元组(struct_time),格式化时间
时间戳时间print(time.time())
格式化时间:print(time.strftime("%Y-%m-%d %H-%M-%S"))--->2018-05-10 20-59-39当前时间
      print(time.strftime("%Y-%m-%d %H-%M-%S",time.)
结构化时间:print(time.localtime())--->time.struct_time(tm_year=2018, tm_mon=5, tm_mday=10, tm_hour=21, tm_min=3, tm_sec=43, tm_wday=3, tm_yday=130, tm_isdst=0)
      print(time.localtime(1500000000))-->可以接收一个时间戳时间

 

 



结构化时间是时间戳时间(计算机看懂的时间)转化为格式化时间(人能看懂的时间)的桥梁


二、random模块,随机取值模块

imoprt random
print(random.random())--->随机生成一个大于0小于1的小数
print(random.ranint(1,5))--->随机生成一个1到5之间的整数
print(random.randrange(1,10,2))--->随机生成一个1到10之间的奇数
print(random.choice([1,'小A在哪',[4,5]])) --->随机返回一个元素,返回1或者小A在哪,[4,5]
print(random.sample([1,2,3,4,5,6],3))-->返回列表元素任意三个组合,random.sample(list,n)注意,n的值必须大于list的列表长度
随机生成一个6位数的验证码的练习:
  import random
  def ran():
    str1 = ''
   for i in range(6):#循环几次生成一个几位数的二维码
      num=random.randint(1,10)) #生成一个1-10之间的整数
      s1=chr(random.randint(65,90))#数字转化成对应的大写字母A-Z
      s2=chr(random.randint(97,122))#数字转化成对应的小写字母a-z
      s=random.choice([str(num),s1,s2])#随机列表中的一个值
      str1 += s #将每次随机返回的字符串拼接
    return str
 
三、sys 模块:sys模块是与python解释器交互的一个接口
sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version        获取Python解释程序的版本信息
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
例如:print(sys.argv)--->结果为['D:/oldboy/day05/复习视频/木块.py']
sys.platform 返回操作系统平台名称一个模块能否被导入,全看在不在sys.path列表所包含的列表下

四、os模块,os模块是与操作系统交互的一个接口
删除文件夹相关的:
  os.makedirs('dirname1/dirname2')    可生成多层递归目录
  os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
  os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
  os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
文件路径相关:
  os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
  os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
  os.curdir  返回当前目录: ('.')
  os.pardir  获取当前目录的父目录字符串名:('..')

os.environ  获取系统环境变量

  os.system("bash command")  运行shell命令,直接显示
  os.popen("bash command).read()  运行shell命令,获取执行结果
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的大小
hashlib模块:将一个字符串进行摘要运算,拿到一个固定的值,hashlib模块不是一个算法,是包含了多个算法的模块
比较常用的算法是SHA算法和Md5算法
功能:加密功能;校验文件的一致性
import hashlib
md5Obj = hashlib.md5() #实例化一个MD5摘要算法的对象
md5Obj.update('liuhaiyang'.encode('utf-8')) #使用MD5算法的对象,来操作一个字符串,注意操作的字符串必须转化为byte类型,使用encoding
a = md5Obj.hexdigest() #获取算法的结果得到一个16进制的结果
print(a)----> d0117e9ad06e29b46169e72a73c8b56c

SHA 算法:用法和md5的使用方法一样,最常用的是sha1
ret1 = hashlib.sha1()
ret1.update('liuhaiyang'.encode('utf-8'))
a = ret1.hexdigest()
print(a)------>e0ca364ff0d9b28115e7566c56a991c12954b8df

为了避免撞库加盐:md5Obj = hashlib.md5('alex'.encoding('utf-8'))
当然这种方式也不安全,就采用动态加盐 username = 'alex'

md5Obj = hashlib.md5(username.encoding('utf-8')
configparser 模块:只要处理配置文件
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)----->生成一个配置example.ini的配置文件

print(config.sections())        #  []
config.read('example.ini')
print(config.sections()) # ['bitbucket.org', 'topsecret.server.com']
print('bytebong.com' in config) # False
print('bitbucket.org' in config) # True

print(config['bitbucket.org']["user"]) # hg
print(config['DEFAULT']['Compression']) #yes
print(config['topsecret.server.com']['ForwardX11']) #no
print(config['bitbucket.org']) #<Section: bitbucket.org>
for key in config['bitbucket.org']: # 注意,有default会默认default的键
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
logging模块:日志模块,一些程序执行的中间过程,以及用户行为,需要记录下来,当程序出错的时候(对内看的),方便查找
logging有两种用法:1.简单配置--不支持中文
2.使用logger对象的方式配置,该方法使用的时候更多一些!
简单配置:
import logging
logging.debug() #非常细节的操作,都记录,方便排查错误
logging.info() #正常的操作信息
logging.warning() #操作导致程序问题,但是程序可以正常运转
logging.error() #操作导致程序问题,程序不能正常运转了
logging.critical() #操作导致程序崩溃
简单配置使用:
import logging

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')----> warning message,error message,critical message 默认输出warning级别以上的日志

import logging

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')----> warning message,error message,critical message 默认输出warning级别以上的日志


import logging
logging.basicConfig(level=logging.DEBUG) #指定日志的输出级别
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')--->输出所有的debug信息
灵活配置日志级别,日志格式,输出位置:
import logging  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='/tmp/test.log',  
                    filemode='w')  
  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

logger对象配置:

logger = logging.getLogger()
fh = logging.FileHandle('log.log',enconding='utf-8') #创建一个可操作性的文件对象,fh
logger.addHandler(fh)
sh = logger.StreamHandle()#创建一个对象,往屏幕上输出
logger.addHandler(sh)
logger.warning('warning message')

指定日志输出格式:
logger = logging.getLogger()
'''创建一个日志输出的格式,可以指定多个格式,让屏幕和文件显示不同的日志格式'''
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#往文件中输入
fh = logging.FileHandler('log.log') #创造一个可以操作文件的对象
fh.setFormatter(formatter)
logger.addHandler(fh)#往文件里输入
sh = logging.StreamHandler()#往屏幕上输出
sh.setFormatter(formatter)
logger.addHandler(sh)
logger.warning('warning message')
 
posted @ 2018-05-10 18:53  小A在哪  阅读(277)  评论(0编辑  收藏  举报