zoukankan      html  css  js  c++  java
  • 模块

    一、定义

    模块:用来从逻辑上组织python代码(变量,函数,类,逻辑----实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块就是test)

    包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py文件)

    二、导入方法

    module_cc文件里有很多函数&变量:

    import module1_name

    import module1_name,module2_name

    from module_cc import *   #把其他模块的东西全部导入过来执行一遍

    from module_cc import m1,m2,m3

    from module_alex import logger as logger_alex#若导入的模块名与当前的函数名相同,则可用as对导入的模块名重命名

    三、 import本质

    导入模块的本质就是把python文件解释一遍;

    导入包的本质就是执行该包下的__init__.py文件;

    四、模块分类

    python的模块又分为以下三种:

    • 自定义模块
    • 内置标准模块(标准库)
    • 开源模块

    五、自定义模块

          、、、、、、

    六、内置常用模块

    1、time模块

    时间的三种方式:

    时间戳(timestamp)        :数字(计算机能认识的)

    时间字符串(form string):t='2012-12-12'

    结构化时间(time_struct):time.struct_time(tm_year=2017, tm_mon=8, tm_mday=8, tm_hour=8, tm_min=4, tm_sec=32, tm_wday=1, tm_yday=220, tm_isdst=0)像这样的就是结构化时间

    • time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来、
    • time.time()当前时间的时间戳、
    • time.localtime()当前的结构化时间对象、
    • time.gmtime()国际时间
    ***** python中时间日期格式化符号****** 
    1 %y 两位数的年份表示(00-992 %Y 四位数的年份表示(000-99993 %m 月份(01-124 %d 月内中的一天(0-315 %H 24小时制小时数(0-236 %I 12小时制小时数(01-127 %M 分钟数(00=598 %S 秒(00-599 %a 本地简化星期名称
    10 %A 本地完整星期名称
    11 %b 本地简化的月份名称
    12 %B 本地完整的月份名称
    13 %c 本地相应的日期表示和时间表示
    14 %j 年内的一天(001-36615 %p 本地A.M.或P.M.的等价符
    16 %U 一年中的星期数(00-53)星期天为星期的开始
    17 %w 星期(0-6),星期天为星期的开始
    18 %W 一年中的星期数(00-53)星期一为星期的开始
    19 %x 本地相应的日期表示
    20 %X 本地相应的时间表示
    21 %Z 当前时区的名称
    22 %% %号本身
    import time
    
    # time_demo1 = time.clock()
    # time_demo2 = time.process_time()
    # time_dmeo3 = time.time()
    # time_demo4 = time.localtime()
    # time_demo5 = time.gmtime()
    # print(time_demo1) #0.112510988
    # print(time_demo2) #0.203125测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来
    # print(time_dmeo3) #1557717882.739453当前时间的时间戳
    # print(time_demo4) #当前的结构化时间对象(utc时间)(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=11, tm_min=26, tm_sec=37, tm_wday=0, tm_yday=1)
    # print(time_demo5) #国际时间(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=3, tm_min=31, tm_sec=37, tm_wday=0, tm_yday=133, tm_isdst=0)
    ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-
    # print(time.ctime()) #当前系统时间 Mon May 13 11:35:19 2019
    # print(time.gmtime(time.time())) #转换成time.struct_time格式(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=3, tm_min=38, tm_sec=53, tm_wday=0, tm_yday=133, tm_isdst=0)
    # print(time.mktime(time.localtime())) #与上面的相反,将struct_time格式转回成时间戳格式。1557718878.0
    
    # 时间延迟 time.sleep()
    # time.sleep(10)  #延迟10秒
    ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
    # 将struct_time格式转成指定的字符串格式
    # print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))) #2019-05-13 11:48:17
    
    # 将字符串格式转成struct_time格式
    # print(time.strptime("2016-9-9","%Y-%m-%d")) #time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=253,

    2、datetime模块

    import  datetime
    # print(datetime.date.fromtimestamp(time.time() - 100000)) #2019-05-12为减去的时间1000000
    # print(datetime.date.today())  #2019-05-13
    # print(datetime.date.fromtimestamp(time.time() - 100000)) #2019-05-12
    
    
    # time_demo = datetime.datetime.now()
    # print(time_demo) #2019-05-13 13:28:10.131284
    # 返回struct_time格式的时间
    # print(time_demo.timetuple()) #time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=13, tm_min=30, tm_sec=2, tm_wday=0, tm_yday=133, tm_isdst=-1)
    #指定替换
    #print(time_demo.replace(2018,8,8)) #2018-08-08 13:32:29.776685
    
    # 字符串转换为日期格式
    # time_demo2 = datetime.datetime.strptime("2019-9-9","%Y-%m-%d")
    # print(time_demo2) #2019-09-09 00:00:00
    # 时间的计算
    # 加10天
    # time_demo3 = datetime.datetime.now() + datetime.timedelta(days = 10)
    # print(time_demo3) # 2019-05-23 13:44:06.759625
    # 减10小时
    # time_demo3 = datetime.datetime.now() + datetime.timedelta(hours = 10)
    # # print(time_demo3) #2019-05-13 23:47:07.829724
    # 减200s
    # time_demo3 = datetime.datetime.now() - datetime.timedelta(seconds = 200)
    # print(time_demo3) #2019-05-13 13:45:21.479477

     3、random

    import random
    
    # 1.随机小数
    # print(random.random()) #随机0-1的小数
    # print(random.uniform(1,9)) # 随机1-9的小数
    
    # 2.随机整数
    # print(random.randint(1,6)) #随机1-6的整数
    # print(random.randrange(1,9,2)) #随机1-9之间的奇数
    
    # 3.随机选择一个返回值   里面是一个列表
    # print(random.choice([1,23,45435,"hello",[1,33,43,32]]))
    
    # 4.随机选择一组数据组合
    # print(random.sample([2,2213,43,"","diss",[1,2,3]],3))
    
    # 5.打乱列表顺序
    # list_demo = [1,2,3,44,56,76,43,35]
    # random.shuffle(list_demo)  #打乱顺序
    # print(list_demo)

    验证码例子

     1 # 验证码小例子(这个只是产生随机的四位数字)
     2 # 方法一、
     3 # l=[]
     4 # for i in range(4):
     5 #     l.append(str(random.randint(0,9)))
     6 # print(''.join(l))
     7 # print(l)
     8 
     9 
    10 # 方法二
    11 # print(random.randint(1000,9999))
    12 
    13 
    14 # 验证码升级版
    15 # 要求:首次要有数字,其次要有字母,一共四位,可以重复
    16 # chr(65-90)#a-z
    17 # chr(97-122)#A-Z
    18 
    19 方法一
    20 # num_list = list(range(10))
    21 # new_num_l=list(map(str,num_list))#['0','1'...'9']
    22 # l=[] #用来存字母
    23 # for i in range(65,91):
    24 #     zifu=chr(i)
    25 #     l.append(zifu)  #['A'-'Z']
    26 # new_num_l.extend(l) #要把上面的数字和下面的字母拼在一块
    27 # print(new_num_l)
    28 # ret_l=[] #存生成的随机数字或字母
    29 # for i in range(4): #从new_num_l里面选数字选择四次就放到了ret_l里面)
    30 #     ret_l.append(random.choice(new_num_l))
    31 # # print(ret_l)
    32 # print(''.join(ret_l)) #拼成字符串
    33 
    34 方法二
    35 # import random
    36 # def myrandom():
    37 #     new_num_l=list(map(str,range(10)))
    38 #     l=[chr(i) for i in range(65,91)]
    39 #     new_num_l.extend(l)
    40 #     ret_l=[random.choice(new_num_l) for i in range(4)]
    41 #     return ''.join(ret_l)
    42 # print(myrandom())
    43 
    44 方法三
    45 import random
    46 l=list(str(range(10)))+[chr(i) for i in range(65,91)]+[chr(j) for j in range(97,122)]
    47 print(''.join(random.sample(l,4)))
    View Code

     4、OS模块

     1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
     2 os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
     3 os.curdir  返回当前目录: ('.')
     4 os.pardir  获取当前目录的父目录字符串名:('..')
     5 os.makedirs('dirname1/dirname2')    可生成多层递归目录
     6 os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
     7 os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
     8 os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
     9 os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    10 os.remove()  删除一个文件
    11 os.rename("oldname","newname")  重命名文件/目录
    12 os.stat('path/filename')  获取文件/目录信息
    13 os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    14 os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    15 os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
    16 os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    17 os.system("bash command")  运行shell命令,直接显示
    18 os.popen("bash command)  运行shell命令,获取执行结果
    19 os.environ  获取系统环境变量
    20 
    21 
    22 os.path
    23 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以/或结尾,那么就会返回空值。
    24                         即os.path.split(path)的第二个元素
    25 os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
    26 os.path.isabs(path)  如果path是绝对路径,返回True
    27 os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
    28 os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
    29 os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    30 os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间
    31 os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    32 os.path.getsize(path) 返回path的大小

    注意:os.stat('pathfilename') 获取文件目录信息的结构说明

    stat 结构:
     
    st_mode: inode 保护模式
    st_ino: inode 节点号。
    st_dev: inode 驻留的设备。
    st_nlink: inode 的链接数。
    st_uid: 所有者的用户ID。
    st_gid: 所有者的组ID。
    st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
    st_atime: 上次访问的时间。
    st_mtime: 最后一次修改的时间。
    st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,<br>在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

     实例:

    import  os
    # print(os.name)#输出字符串指示正在使用的平台。如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix'。
    # print(os.getcwd())#函数得到当前工作目录,即当前Python脚本工作的目录路径。
    # print(os.listdir())#列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印。
    
    # print(os.getcwd())#更改当前文件脚本目录,相当于shell下的cd
    # os.chdir(r'C:Userswb-sxy488976PycharmProjectscEshi')
    # print(os.getcwd())
    
    # print(os.curdir)#返回当前目录(.)
    # print(os.pardir)#返回当前目录的父级目录(..)
    # os.makedirs('A/B/C')# 生成A/B/C文件
    # os.removedirs('A/B/C')#移除A/B/C文件
    # os.mkdir('D')#生成单级目录;相当于shell中mkdir dirname
    # os.rmdir('A/B/C')#删除单级空目录,若目录不为空则报错
    # os.remove('D/111')#删除文件111
    # os.rename('D','C')#重新命名文件名  文件名D换成C
    # print(os.stat('C'))# 获取指定文件/目录信息os.stat_result(st_mode=16895, st_ino=2533274790608707, st_dev=1855382052, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1557737135, st_mtime=1557736977, st_ctime=1557736787)
    # print(os.sep)#输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    # print(os.pathsep) # #输出用于分割文件路径的字符串
    # os.system('ipconfig') #显示网络链接情况
    # print(os.environ)#获取系统环境变量
    # print(os.path.abspath('python'))  #返回path规范化的绝对路径
    # print(os.path.split('python'))#('', 'python')将path分割成目录和文件二元组返回
    # print(os.path.basename('python.txt')) #python.txt返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    # print(os.path.exists('A')) #如果path存在,返回True;如果path不存在,返回False
    # print(os.path.isabs("A")) #如果path是绝对路径则返回True
    # print(os.path.isfile('A')) #如果path是一个存在的文件,返回True。否则返回False
    # print(os.path.isdir('A')) #如果path是一个存在的目录,则返回True。否则返回False
    # print(os.path.join((path1[, path2[, ...]])) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    ——————————————————————————————————————————————————
    # import time
    # 返回path所指向的文件或者目录的最后存取时间
    # t = os.path.getatime(r'A')
    # x = time.localtime(t)
    # print(time.strftime('%Y-%m-%d %H:%M:%S',x))
    # 返回path所指向的文件或者目录的最后修改时间
    # t = os.path.getmtime(r'A')
    # x = time.localtime(t)
    # print(time.strftime('%Y-%m-%d %H:%M:%S',x))
    View Code

     5、sys模块

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.version        获取Python解释程序的版本信息
    sys.maxint         最大的Int值
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    sys.stdout.write('please:')
    val = sys.stdin.readline()[:-1]

    实例:

    import  sys
    # name = sys.argv[1]
    # password = sys.argv[2]
    # if name == 'lala' and password == '123456':
    #     print('go go ...')
    # else:
    #      exit()
    # sys.exit()#退出程序,正常退出时exit(0)
    # print(sys.version)#3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]
    # print(sys.maxsize) #9223372036854775807
    # print(sys.path)#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    # print(sys.platform)# win32
    View Code

     6、logging模块

    默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。(通过basicconfig设置输出格式)

    import logging
    logging.basicConfig(filename="file1.log",  #创建接收日志文件
                        level=logging.DEBUG,  #设置打印日志级别
                        format='%(asctime)s %(lineno)s %(message)s',  #输出日志格式
                        datefmt='%Y/%m/%d %H:%M:%S')  #输出时间格式
    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warning message')  #warning 警告(从警告开始才执行)
    logging.error('error message') #error 错误
    logging.critical('critical message') #比错误更严重的级别

    日志格式(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

    用户输出的消息

     

    Python 使用logging模块记录日志涉及四个主要类:

    logger提供了应用程序可以直接使用的接口;

    handler将(logger创建的)日志记录发送到合适的目的输出;

    filter提供了细度设备来决定输出哪条日志记录;

    formatter决定日志记录的最终输出格式。

    logger
    每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
    LOG=logging.getLogger(”chat.gui”)
    而核心模块可以这样:
    LOG=logging.getLogger(”chat.kernel”)

    Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
    Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
    Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
    Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别

    handler

    handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
    Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
    Handler.setFormatter():给这个handler选择一个格式
    Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象


    每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
    1) logging.StreamHandler
    使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
    StreamHandler([strm])
    其中strm参数是一个文件对象。默认是sys.stderr

    2) logging.FileHandler
    和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
    FileHandler(filename[,mode])
    filename是文件名,必须指定一个文件名。
    mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。

    3) logging.handlers.RotatingFileHandler
    这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
    RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
    其中filename和mode两个参数和FileHandler一样。
    maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
    backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。

    4) logging.handlers.TimedRotatingFileHandler
    这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
    TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
    其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
    interval是时间间隔。
    when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
    S 秒
    M 分
    H 小时
    D 天
    W 每星期(interval==0时代表星期一)
    midnight 每天凌晨

    实例:屏幕和文件一起显示

     1 import logging
     2 def mylogger(filename,file=True,stream=True):
     3     logger = logging.getLogger()
     4     formater = logging.Formatter(
     5         fmt='%(name)s %(asctime)s [%(lineno)d] ---%(message)s',
     6         datefmt='%d/%m/%Y %H:%M:%S'  # 时间格式
     7     )
     8     logger.setLevel(logging.DEBUG)  #指定日志打印的等级
     9     if file:
    10         file_handler = logging.FileHandler('logging.log',encoding='utf-8')# 创建一个handler,用于写入日志文件
    11         file_handler.setFormatter(formater)  # 文件流,文件操作符
    12         logger.addHandler(file_handler)
    13     if stream:
    14         stream_handler = logging.StreamHandler()  # 再创建一个handler,用于输出到控制台
    15         stream_handler.setFormatter(formater) #屏幕流,屏幕操作流
    16         #如果想让文件流和屏幕流输出的东西的格式不一样,那么就在写一个 格式formater1,这样就可以了
    17         logger.addHandler(stream_handler)
    18     return logger
    19 logger = mylogger('logging.log',file=False)
    20 logger.warning('6666666')
    21 logger.debug('debug message')

     思路:创建logger->创建一个file输出(创建Handler,写入日志->setformatter设置输出格式->addHandler()添加logger)->

               创建一个Stream输出(创建Handler,写入日志->setformatter设置输出格式->addHandler()添加logger)->

               返回 logger

  • 相关阅读:
    Oracle 建用户、 表空间脚本
    Java常见Jar包的用途
    EF:无法检查模型兼容性,因为数据库不包含模型元数据。
    Eclipse -Xms256M -Xmx640M -XX:PermSize=256m -XX:MaxPermSize=768m
    CentOS远程连接Windows操作系统
    spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求
    jvm
    jvm
    spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
    spring boot / cloud (十八) 使用docker快速搭建本地环境
  • 原文地址:https://www.cnblogs.com/070727sun/p/10856327.html
Copyright © 2011-2022 走看看