zoukankan      html  css  js  c++  java
  • python基础------模块

    一,日志模块:logging

     1 #简单应用
     2 import logging
     3 logging.debug("hello python")
     4 logging.info("hello world")
     5 logging.warning("hello java")  #日志级别默认WARNUNG 只显示warning一下的,上面的debug,info没打印出来
     6 logging.error("hello C")
     7 logging.critical("hello C++")
     8 
     9 #打印结果:
    10 #WARNING:root:hello java
    11 #ERROR:root:hello C
    12 #CRITICAL:root:hello C++
    13 #

    日志的等级从下到上:critical-->error-->warning-->info-->debug

    2,灵活设置日志等级,位置,日志格式

     1 import logging
     2 #日志等级设置成debug
     3 logging.basicConfig(level=logging.DEBUG,  #日志等级设置成debug
     4                     format="%(asctime)s %(filename)s %(levelname)s %(message)s",
     5                     filename = "test.txt", #设置文件名
     6                     filemode = "w",    #以w模式写入内容
     7                     )
     8 logging.debug("debug message")
     9 logging.info("info message")
    10 logging.warning("warning message")
    11 logging.error("error message")
    12 logging.critical("critical message")

    2.1 test.txt文件中的内容:

    2017-04-27 19:29:49,808 logging模块.py DEBUG debug message
    2017-04-27 19:29:49,825 logging模块.py INFO info message
    2017-04-27 19:29:49,826 logging模块.py WARNING warning message
    2017-04-27 19:29:49,826 logging模块.py ERROR error message
    2017-04-27 19:29:49,826 logging模块.py CRITICAL critical message

    2.2  format中可能用到的格式化串

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

    2.3 logger对象方法:推荐用法

     1 import logging
     2 #日志模块
     3 def get_logger():
     4     logger = logging.getLogger() #获得一个logger对象
     5 
     6     fh = logging.FileHandler("a.txt") # 创建一个文件流,需要给一个文件参数
     7 
     8     sh = logging.StreamHandler()  #创建一个屏幕流,
     9 
    10     logger.setLevel(logging.DEBUG) #设定最低等级debug
    11     #写入文件的中的格式
    12     fm = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    13 
    14     logger.addHandler(fh)#把文件流添加进来,流向文件
    15     logger.addHandler(sh) #把屏幕流添加进来,流向屏幕
    16 
    17     fh.setFormatter(fm) #在文件流添加写入格式
    18     sh.setFormatter(fm) #在屏幕流添加写入格式
    19 
    20     return logger
    21 
    22 logger = get_logger()
    23 logger.debug("hello world")
    24 logger.info("world python")
    25 logger.warning("hello java")
    26 logger.error("python C")
    27 logger.critical("hello C++")

    2.3 a.txt文件中内容

     1 #内容都是一样的,只是两个流派都弄出来了
     2 
     3 #屏幕上的内容:
     4 2017-04-27 19:57:38,336 - root - DEBUG - hello world
     5 2017-04-27 19:57:38,337 - root - INFO - world python
     6 2017-04-27 19:57:38,337 - root - WARNING - hello java
     7 2017-04-27 19:57:38,337 - root - ERROR - python C
     8 2017-04-27 19:57:38,338 - root - CRITICAL - hello C++
     9 
    10 
    11 #文件中的内容:
    12 2017-04-27 19:57:38,336 - root - DEBUG - hello world
    13 2017-04-27 19:57:38,337 - root - INFO - world python
    14 2017-04-27 19:57:38,337 - root - WARNING - hello java
    15 2017-04-27 19:57:38,337 - root - ERROR - python C
    16 2017-04-27 19:57:38,338 - root - CRITICAL - hello C++

    二:序列化模块:json 重要

    1,只有两个方法,1.1,序列化方法,1.2,反序列方法

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

     1 import json,os
     2 # d={"name":"egon"}
     3 #
     4 # s =json.dumps(d)
     5 #
     6 # f = open("b.txt","w")
     7 # f.write(s)
     8 #
     9 # f.close()
    10 # a=open("b.txt")
    11 # data = a.read()
    12 # data2 = json.loads(data)
    13 # print(data2["name"])
    14 # a.close()
    15 
    16 #序列化方法,就是把数据以json字符串形式写入到文件
    17 d = {"name":"egon"}
    18 
    19 j = json.dumps(d) #把字典转成json字符串
    20 
    21 f = open("b.txt","w")
    22 f.write(j)  #等同于data = json.dump(d,f)
    23 f.close()
    24 
    25 #反序列化方法,
    26 f = open("b.txt")
    27 data = json.loads(f.read())  #把文件中的json字符串读出来,以字典的格式
    28 print(data["name"])   #egon
    29 f.close()

    三,pickle 模块

    跟json差不多,只能在python之间用,有局限性

    四,os模块,正则表达式

    元字符:

      1,   .  通配符,可以代替除了 之外的所有字符

      2,   +  重复前一个字符1到无穷次

      3,   *  重复前一个字符0到无穷次

      4,   ?  重复前一个字符0到1次

      5,   ^  从字符串开头匹配,在[]里就是取反的意思

      6,   $  从字符串结尾匹配

      7,   |   或的关系

      8,     转义符  1,在元字符前加上使其变成普通的字符,2,将普通字符变成有特殊功能的符号,后面会介绍

      9,   ()   分组  在有()的时候匹配,优先匹配  可以在()里加上?:取消优先级,不要问我为什么,这是语法 

      10, {} 可以指定范围,还可以指定重复次数

      11,  []     * + . 在列表里都是普通字符,  -  ^   还有特殊意义

      1 import re
      2 
      3 #  .
      4 print(re.findall("e.l","hello"))  #['ell']
      5 print(re.findall("o...r","hello world")) #['o wor']
      6 
      7 #  +
      8 print(re.findall("a+","aab"))   #['aa']
      9 print(re.findall("ab+","abbbbcc"))  #['abbbb']
     10 
     11 #  *
     12 print(re.findall("ab*","abbbc"))  #['abbb']
     13 print(re.findall("abbc*","abbbb"))# ['abb'] *是从0次开始
     14 
     15 # + *都是贪婪匹配 在后面加上?就变成惰性匹配了
     16 print(re.findall("ab+?","abbbcd")) #['ab']
     17 print(re.findall("ab*?","abbbcd")) #['a']
     18 
     19 #
     20 print(re.findall("ab?","abbc")) #['ab']
     21 print(re.findall("abcc?","abccc")) #['abcc']
     22 
     23 #  ^
     24 print(re.findall("^hello","helloworld")) #['hello']
     25 print(re.findall("^hello","pthon"))    # []
     26 
     27 #  $
     28 print(re.findall("ern$","pattern"))  # ['ern']
     29 print(re.findall("erl$","pattern"))  # []
     30 
     31 #  |
     32 print(re.findall("(ab)|d","addfab45vj")) #['ab', '', '']
     33 data = re.search("(ab)|d","addfab45vj")
     34 print(data.group())    #ab
     35 
     36 #  
     37 print(re.findall("ad","a34d51")) #['a3']
     38 print(re.findall("h*e","h*ello")) #['h*e']
     39 '''
     40 d  匹配任何十进制数;它相当于类 [0-9]。
     41 D 匹配任何非数字字符;它相当于类 [^0-9]。
     42 s  匹配任何空白字符;它相当于类 [ 	
    
    fv]。
     43 S 匹配任何非空白字符;它相当于类 [^ 	
    
    fv]。
     44 w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
     45 W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
     46   匹配一个特殊字符边界,比如空格 ,&,#等
     47 '''
     48 print(re.findall("d","h*el3l452o")) #['3', '4', '5', '2']
     49 print(re.findall("D","h4e3ll2o"))   #['h', 'e', 'l', 'l', 'o']
     50 print(re.findall("s","h e	l
    lvo")) #[' ', '	', '
    ', 'x0b']
     51 print(re.findall("S","h	e
    llo"))    #['h', 'e', 'l', 'l', 'o']
     52 print(re.findall("w","h2<>3*l4"))     #['h', '2', '3', 'l', '4']
     53 print(re.findall("W","h*2j$3
    o")) #['*', '$', '
    ']
     54 print(re.findall("","h*ello"))  #[]
     55 
     56 # {}
     57 print(re.findall("b{2}","abbbbc")) #['bb', 'bb'] 指定重复2次
     58 print(re.findall("ab{1,3}","abbbbbc")) #['abbb']  指定范围,1到3次重复
     59 
     60 # ()
     61 print(re.findall(r"(ab)+c","ababc"))#['ab'] 因为括号的优先级,只显示括号内的匹配内容,括号外的+是匹配到了只是没显示出来
     62 print(re.findall(r"(?:ab)+c","ababc")) #['ababc'] 加上?:取消括号的优先级,结果都显示出来了
     63 
     64 # []
     65 print(re.findall("a[bc]d","acd"))#['acd'] 匹配列表中的任意一个 只要满足就匹配出来了
     66 print(re.findall("a[bc]d","abd"))#['abd']
     67 
     68 print(re.findall("[*+.]","da.j34*js+")) #['.', '*', '+'] .* + 在列表内都是普通字符
     69 print(re.findall("[^d]","she231j")) #['s', 'h', 'e', 'j'] ^在列表内表示取反
     70 print(re.findall("[a-z]","hello")) #['h', 'e', 'l', 'l', 'o'] - 在列表内表示a-z的范围都取
     71 print(re.findall("[A-Z]","HeLLo")) #['H', 'L', 'L'] 只取A-Z的大写英文字母
     72 print(re.findall("[0-9]","h1e2l3l4o5")) #['1', '2', '3', '4', '5'] 只取0-9的数字
     73 print(re.findall("[s]","
    sa")) # ['
    '] 还是有特殊意义
     74 
     75 # r 在匹配规则前加上,使在ascll码类有特殊意义的变成原生字符串
     76 #print(re.findall('cl','abcle')) #[] l在ascll码表里有站位,所以匹配不出来
     77 print(re.findall('c\\l','abcle')) #['c\l']
     78 print(re.findall(r"c\l","abcle")) #['c\l'] 变成原生字符串
     79 
     80 # re方法
     81 
     82 # re.finddall  #返回所有满足匹配条件的结果,放在列表里
     83 ret = re.findall("ab","abcaa")
     84 print(ret) #['ab']
     85 
     86 # re.finditer  可迭代对象,迭代器
     87 ret = re.finditer("a","abacdef")
     88 print(next(ret).group()) #a
     89 print(next(ret).group()) #a
     90 
     91 # re.seach 只匹配第一个结果  函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
     92                         # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
     93 ret = re.search("d","h31el34l5o0")
     94 print(ret.group()) # 3
     95 
     96 # re.math 只在字符串开始的位置匹配
     97 ret = re.match("he","hello")
     98 print(ret.group()) # he
     99 
    100 # re.split 分割 先按l分割,得到'he',''和lo,在从'',lo开始分割,得到下面结果
    101 ret = re.split("l","hello")
    102 print(ret)  # ['he', '', 'o']
    103 
    104 # re.sup 替换
    105 ret = re.sub("l","A","hello")
    106 print(ret)  # heAAo
    107 
    108 #re.subn 替换 返回元组 可以选择添加替换次数,不添加次数,默认字符串里有几个就替换几个
    109 ret = re.subn("l","A","hello")
    110 print(ret) # ('heAAo', 2)
    111 
    112 ret = re.subn("l","A","hello",1)
    113 print(ret) # ('heAlo', 1)
    114 
    115 
    116 #compile 编译方法 好处:对于多个字符串处理效率高
    117 c = re.compile("he") #匹配规则
    118 ret = c.findall("hellohe") #匹配内容
    119 print(ret) #['he', 'he']
  • 相关阅读:
    bash脚本入门
    DNS 递归查询
    场景题
    利用 python 发送邮件(qq 邮件)
    Swagger 简单使用
    Nginx支持HTTPS,生成SSL证书
    使用 Python 搭建简易HTTP服务器
    扫码登陆原理
    【积累】在jQuery.Validate额中使用可以传入参数的message
    关于RUBY处理多语言转字符编码的一点经验 nkf
  • 原文地址:https://www.cnblogs.com/gaoyuan111/p/6776263.html
Copyright © 2011-2022 走看看