zoukankan      html  css  js  c++  java
  • python之路——基础篇(2)模块

    模块:os、sys、time、logging、json/pickle、hashlib、random、re

    模块分为三种:

    • 自定义模块
    • 第三方模块
    • 内置模块

    自定义模块

    1、定义模块

    将一系列功能函数或常量封装为一个独立的.py或多个.py文件。

    2、导入模块

    1 import module
    2 from module.xx import yy
    3 from module.xxxxx import  as rename 对于难于编写可以将其重新命名为一个新的模块名字
    4 from module.xx import * #不介意应用这种导入方式,此种方式对于较大模块容易产生函数名冲突。

    3、导入模块基准路径

    import sys
    sys.path.append("导入模块的路径")
    模块系统路径
    import os
    import sys
    project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(project_path)
    添加模块路径方法

    注:os.path.dirname()表示当前目录的上一级目录

    内置模块

    所谓内置模块是python自带的模块,使用前先导入。

    一、sys

    相关操作:

    sys.argv #命令行参数列表,第一个参数默认是程序路径
    sys.exit(n) #退出程序
    sys.version #获取python解释器的版本信息
    sys.maxint #最大的int值
    sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.stdin #输入相关
    sys.stdout #输出相关
    sys.stderror #错误相关
    
     1 import sys
     2 import time
     3 
     4 
     5 def view_bar(num, total):
     6     rate = float(num) / float(total)
     7     rate_num = int(rate * 100)
     8     r = '
    %s>%d%%' % ("."*rate_num,rate_num, ) # 回到当前行的首个位置
     9     sys.stdout.write(r)
    10     sys.stdout.flush()
    11 
    12 
    13 if __name__ == '__main__':
    14     for i in range(0, 100):
    15         time.sleep(0.1)
    16         view_bar(i, 100)
    进度条

    二、os

    用于提供系统级别的操作——常用一些功能

    os.path.exists(path)     #如果path存在,返回True;如果path不存在,返回False.
    os.makedirs('dir1/dir2') #可生成多层递归目录
    os.removedirs('dirname1')#若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')      #生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')      #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')    #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()              #删除一个文件 
    os.rename("oldname","new")#重命名文件/目录
    os.path.abspath(path)    #返回path规范化的绝对路径
    os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    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.isabs(path)      #如果path是绝对路径,返回True os.path.isfile(path)     #如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)      #如果path是一个存在的目录,则返回True。否则返回False

    三、time  

    • 时间戳               1970年1月1日之后的秒,即:time.time()
    • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
    • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
     1 print time.time()#1970年1月1日之后的秒
     2 print time.mktime(time.localtime())
     3    
     4 print time.gmtime()    #可加时间戳参数
     5 print time.localtime() #可加时间戳参数
     6 print time.strptime('2014-11-11', '%Y-%m-%d')
     7    
     8 print time.strftime('%Y-%m-%d') #默认当前时间
     9 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
    10 print time.asctime()
    11 print time.asctime(time.localtime())
    12 print time.ctime(time.time())
    13    
    14 import datetime
    15 '''
    16 datetime.date:表示日期的类。常用的属性有year, month, day
    17 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
    18 datetime.datetime:表示日期时间
    19 datetime.timedelta:表示时间间隔,即两个时间点之间的长度
    20 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
    21 strftime("%Y-%m-%d")
    22 '''
    23 import datetime
    24 print datetime.datetime.now()
    25 print datetime.datetime.now() - datetime.timedelta(days=5)

     补充:

    print(time.asctime(time.localtime())) #返回时间格式Mon Oct 24 21:21:03 2016"
    print(time.ctime()) #返回Mon Oct 24 21:22:03 2016 格式, 同上
    print(time.ctime(time.time()-86400))#返回Sun Oct 23 21:22:03 2016 返回当前时间的前一天
    print(time.gmtime()) #返回一个struct_time 结构体 将当前时间赋值在struct_time每一个成员中(这里时间是utc时间应该是格林威治时间)
    time.mktime(time.localtime())# mktime 必须传一个struct_time 对象否则报错,将时间对象转换为时间戳
    time.sleep(4) #阻塞秒数
    
    %Y  Year with century as a decimal number.
    %m  Month as a decimal number [01,12].
    %d  Day of the month as a decimal number [01,31].
    %H  Hour (24-hour clock) as a decimal number [00,23].
    %M  Minute as a decimal number [00,59].
    %S  Second as a decimal number [00,61].
    %z  Time zone offset from UTC.
    %a  Locale's abbreviated weekday name.
    %A  Locale's full weekday name.
    %b  Locale's abbreviated month name.
    %B  Locale's full month name.
    %c  Locale's appropriate date and time representation.
    %I  Hour (12-hour clock) as a decimal number [01,12].
    %p  Locale's equivalent of either AM or PM.

    四、logging 日志模块

    • 单文件日志
    1 #写到文件 指定日志级别  注:只有高于或者等于指定级别的信息才会被记录 Debug  info warning error critical
    2 logging.basicConfig(filename='example.log', level=logging.INFO,
    3                     format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')
    4 
    5 logging.debug("I am a debug log ")
    6 logging.info("info log")
    7 logging.warning("warning log")
    8 logging.error("error log")
    9 logging.critical("critical log")
    • 多文件日志
     1 import logging
     2 #create  a logger
     3 logger = logging.getLogger('TEST_LOG')
     4 logger.setLevel(logging.WARNING) #全局日志级别 #如果全局级别高 以全局为准 如果局部变量的级别高 就按局部,
     5 #换句话说  局部最高就优先 全局级别最高 就优先
     6 
     7 #创建输出到屏幕的 handler
     8 ch = logging.StreamHandler()
     9 ch.setLevel(logging.DEBUG) #设置 屏幕输出日志级别
    10 
    11 #创建输出到文件的handler
    12 fh = logging.FileHandler("access.log")
    13 fh.setLevel(logging.DEBUG)
    14 
    15 #往另一个文件写
    16 fh2 = logging.FileHandler("access2.log")
    17 fh2.setLevel(logging.ERROR)
    18 #创建输出格式
    19 formatter_ch = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s ')
    20 formatter_fh = logging.Formatter('%(asctime)s-%(filename)s-%(module)s-%(lineno)d-%(levelname)s-%(message)s')
    21 
    22 #设定 格式
    23 ch.setFormatter(formatter_ch)
    24 fh.setFormatter(formatter_fh)
    25 fh2.setFormatter(formatter_fh)
    26 
    27 #将handler 注册到logger
    28 logger.addHandler(ch)
    29 logger.addHandler(fh)
    30 logger.addHandler(fh2)
    31 
    32 logger.debug("debug log ")
    33 logger.info("info log")
    34 logger.warning("warning log")
    35 logger.error("error log")
    36 logger.critical("critical log")

    Format:日志记录格式

      

     五、序列化

    • json 用于【字符串】和 【python基本数据类型】 间进行转换
    • pickel  用于【python特有的类型】 和 【python基本数据类型】间进行转换
     1 import  json
     2 import requests
     3 #序列化 是将python基本数据类型转化为字符串
     4 dic ={"key":123}
     5 print(dic,type(dic))
     6 ret = json.dumps(dic)
     7 print(ret,type(ret))
     8 
     9 #反序列化 将字符串转化为python 基本数据类型
    10 dic2 = json.loads(ret)
    11 print(dic2,type(dic2))
    12 
    13 re =requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
    14 re.encoding ='utf-8'
    15 print(re.text)
    16 #转化为字典 进行操作
    17 w_dic = json.loads(re.text)
    18 print(w_dic,type(w_dic))
    19 
    20 #dump  and load #dump 先序列化 然后在写入文件 load 先读出来再将数据反序列化为python基本数据类型
    21 li = [11,22,33]
    22 json.dump(li,open('db','w'))
    23 li2 = json.load(open('db','r'))
    24 print(li2,type(li2))

    六、加密hashlib模块 

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法:用法基本相同

    1 import hashlib
    2 def md5(str):
    3     md5_obj = hashlib.md5() # 更安全 可以          md5(bytes(str,encoding='utf-8'))
    4     md5_obj.update(bytes(str,encoding="utf-8"))
    5     encodetext =md5_obj.hexdigest()
    6     print(encodetext)
    7 md5("sdfdsf")

    以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

    1 import hmac  
    2 h = hmac.new(bytes('898oaFs09f',encoding="utf-8")) h.update(bytes('admin',encoding="utf-8")) 
    3 print(h.hexdigest())

    七、随机数random模块

    1 import random
    2  
    3 print(random.random())
    4 print(random.randint(1, 2))
    5 print(random.randrange(1, 10))

    随机验证码实现:

    import random
    checkcode = ''
    for i in range(4):
        current = random.randrange(0,4)
        if current != i:
            temp = chr(random.randint(65,90))
        else:
            temp = random.randint(0,9)
        checkcode += str(temp)
    print checkcode
    

    第三方模块

    • 安装:

    pip3 install requests

    • 源码安装

    例子:安装request

    1.下载第三方模块源码(百度搜索模块名字)

    http://www.python-requests.org/en/master/user/install/#install

    2.解压模块

    3.cd 到setup.py目录下

    4.执行 python setup.py install (如果不依赖其他模块,直接就会安装成功)

    提示(正则表达式我将单独整理)

    >>>END

  • 相关阅读:
    2.8Java专项测试复盘
    我的第一篇博客
    VS2010调试汇编
    socket学习
    DLL 共享数据学习
    PE学习
    char*,const char*和string的相互转换 + 三种版本字符串
    unresolved external symbol “symbol”(不确定的外部“符号”)。
    深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
    volatile学习
  • 原文地址:https://www.cnblogs.com/lcysen/p/5994454.html
Copyright © 2011-2022 走看看