常用模块

一 time 模块

  1、time.altzone()

  作用:返回与utc(协调时间时,又称时间统一时间,以英国为标准)时间的时间差,以秒计算。

  2、time.process_time()

  作用:计算处理器的运算时间,但是不包括sleep时间,sleep只是把程序挂起。

    3、time.asctime()

  作用:返回时间格式 Wed Apr  5 22:45:08 2017

      4、time.localtime()

  作用:返回本地时间的struct time 对象格式

1 >>> import time
2 >>> t = time.localtime()  #返回本地时间的对象,通过对象获取对应的年月日等信息
3 >>> t
4 time.struct_time(tm_year=2017, tm_mon=4, tm_mday=20, tm_hour=15, tm_min=41, tm_sec=1, tm_wday=3, tm_yday=110, tm_isdst=0)
5 >>> t.tm_hour   # 获取小时数
6 15
View Code

   5、time.time()

   作用:返回当前时间戳,从1970(uinx元年)年开始到目前。1970年1月1日为nuix操作系统的出生日

   6、time.gmtime()

   作用:返回当前utc时间(伦敦时间),跟北京时间差8个小时。

   7、time.strptime("2017-4-5 22:30","%Y-%m-%d %H:%M")

   作用:将字符串转换成时间结构体,格式("2017-4-5 22:30","%Y-%m-%d %H:%M")

1 >>>time.strptime("2017-4-5 22:30","%Y-%m-%d %H:%M")
2 time.struct_time(tm_year=2017, tm_mon=4, tm_mday=5, tm_hour=22, tm_min=30, tm_sec=0, tm_wday=2, tm_yday=95, tm_isdst=-1)

  

   8、time.mktime

  作用: 将时间结构体对象(struct_time)转换成时间戳

1 import time
2 >>>a = time.strptime("2017-4-5 22:30","%Y-%m-%d %H:%M")
3 >>>time.mktime(a)
4 1491402600.0

   9、time.strftime

  作用:将struct_time时间对象转换成时间字符串。

1 >>>a = time.strptime("2017-4-5 22:30","%Y-%m-%d %H:%M")
2 >>>m = time.strftime("%Y-%m-%d %H:%M",a)
3 2017-04-05 22:30

  它们之间的转换关系如图:

  

  时间格式转换关系:

二 datetime 模块

  1 datetime.datetime.now()

  作用:显示当前时间  

import datetime
>>>datetime.datetime.now()
2017-04-20 16:22:24.451419

  2 datetime.data.fromtimestamp(time.time())

  作用:时间戳直接转换成日期格式  

import time,datetime
>>>datetime.date.fromtimestamp(time.time())
2017-04-20

  3 datetime.datetime.now()+datetime.timedelta(hours = 3)

import datetime
>>>datetime.datetime.now() + datetime.timedelta(days = 3,hours = 4)
2017-04-23 20:31:07.561339

#正常时间是2017-04-20 16:31:07.56133

  4 datetime.datetime.now.replace(hour = 2,minute = 3)时间替换

import datetime
>>>datetime.datetime.now().replace(hour=2)
2017-04-20 02:33:14.862621

三 random 模块  

  1、random.random() 随机0~1之间小数  

  2、random.randint(a,b) 随机从a,b选一个数,包括a和b  

  3、random.randrange(a,b)或者random.randrange(b) 随机从a,b选一个数,不包括b  

  4、random.sample(tuple,x) 从tuple中选出x个元素

       生成由数字和大小写字母组成的4位随机验证码,代码如下:

 

四 string模块  

  1、string.ascii_letters

  作用:返回大小写字母的字符串。注:一般用于验证码

import 
>>>string.ascii_letters
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

  2、string.digits

  作用:返回数字0-9的字符串

  3、string.ascii_lowercase 

  作用:返回小写字母的字符串

import string
>>>string.ascii_lowercase
abcdefghijklmnopqrstuvwxyz

  4 string.ascii_uppercase

  作用:返回大写字母的字符串

  5 string.punctuation

  作用:以字符串形式返回所有的字符  注:一般用于验证码

import sting
>>>string.punctuation
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

五 hashlib 模块

  用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1、SHA224、SHA256、SHA384、SHA512、MD5算法。使用方法都是一样的。

  MD5加密原则:只要你的输入是固定的,你的输出也一定是固定的。一般用于检测文件的一致性。

import hashlib
m = hashlib.md5()  # 创建hash对象
print(m)         # <md5 HASH object @ 0x0000000000B90A30>
m.update(b"liupeng") #更新哈希对象以字符串参数
print(m.digest()) #返回摘要,作为二进制数据字符串值
print(m.hexdigest()) # 返回十六进制数字字符串
print(m.digest_size) # 产生散列的字节大小
print(m.block_size)
View Code

  常用属性:

  1 hashlib.algorithms # 列出所有的算法

  2 h.digest_size #产生的散列的字节大小

  3 h.block_size 

  常用方法:

  1 hash.update(arg) 更新哈希对象以字符串参数,如果同一个hash对象重复调用该方法,则m.update(a);m.update(b) == m.update(a+b)

  2 hash.digest() 返回摘要,作为二进制数据字符串

  3 hash.hexdigest() 返回摘要,作为十六进制数据字符串值

  4 hash.copy() 复制

六 subprocess 模块

  从python2.4开始,python引入subprocess模块来管理子进程。

  subprocess不仅可以创建子进程,还提供一些标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

  常用的功能:

  1、subprocess.call()

  父进程等待子进程完成,返回退出信息(相当于linux exit code)。如果不需要与子进程通讯就可以使用该函数来创建。

  2、subprocess.check_call()

  与subprocess.call()功能一样,只是如果子进程返回的returncode不为0的话,将触发calledprocesserror异常,在异常对象中包括进程的returncode信息。一般用try...except..来检查。

  3、subprocess.check_output() 父进程等待子进程完成,返回子进程向标准输出的输出结果。检查退出信息,如果returncodeo不为0,则报出错误subprocess.calledprocesserr,该对象包含有returncode属性和output属性为标准输出的输出结果,可用try...except...来检查

  4、subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

  对其参数一个个解释:

  args 字符串或者序列类型(如list、元组),表示要执行的命令和命令的参数;

  bufsize 指定缓冲

  executable 用于指定可执行程序,如果将shell 设定为 True,executable 将指定程序使用shell

  stdin、stdout、stderr分别表示程序的标准输入、输出、错与句柄。他们可以是PIPE,文件描述或文件对象,也可以设置为None,表示从父进程继承。

  preexec_fn只在Unix平台下有效,用于指定一个可执行对象,它将在子进程运行之前被调用。

  shell = True,表示你前面的传入的命令将在shell下执行,如果你的命令是个可执行文件或者bat。

  cwd用于设置子进程的当前目录

  env 它是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

  universal_newlines 不同操作系统下,文本的换行符是不一样的。如在windows下,用'/r/n' 表示换行,而在linux下用'/n'.如果将此参数设置为True,python统一把这些换行符当做为'/n'

  startupinfo 与createionflags 只在windows下有小,他们将被传递给底层的creteprocess()函数,用于设置子进程的一些属性,如:主窗口的外观、进程的优先级等等、

  Popen对象创建后,主程序不会自动等待子进程完成。必须调用对象的wait()方法,父进程才会等待(也就是阻塞block),举个例子来说说:

>>> import subprocess
>>> child = subprocess.Popen('ping -c 4n www.baidu.com',shell =True)
>>> child.wait()
>>> print 'parent process'

  从运行结果中看,父进程在开启子进程之后等待child的完成,再运行print。如果没有wait()就会,直接运行print.

  此外,还能在父进程中对子进程进行操作,如:

  a、child.poll() 检查子进程状态,设置并返回returncode 属性

  b、child.kill() 、child.terminate() 终止子进程

      c、child.send_signal() 向子进程发送信号

  d、child.communicate 可以与新进程交互,向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。

    communicate()返回一个元组:(stdoutdata,stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候

    参数stin必须被设置为PIPE。同样,如果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE

1 >>> import subprocess
2 >>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
3 >>> child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
4 >>> out = child2.communicate()
5 
6 #输出
7 ('root:x:0:0:root:/root:/bin/bash\n', None)

  在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe)。

  subprocess.PIPE实际上为文本流提供一个缓存区。child1的stdout将文本输出到缓存区,随后child2的stdin从该PIPE中将文本读取走。child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。

  注意:communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成

7、logging模块

  在程序中都有记录日志的需求,并且日志中包含的信息即有正常的程序访问。python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,logging的日志可以分为debug()、info()、warning()、error()、and critical() 5个级别,级别是越来越高,设置的级别越低,打印日志等级越多。

  基本用法

1 import logging
2 logging.basicConfig(filename='test.log',level=logging.INFO,format='%(asctime)s %(module)s %(levelname)s %(message)s',datefmt='%m/%d/%Y %H:%M:%S %p')
3 #注意上面字母的大小写,不能混淆
4 logging.debug("debug")
5 logging.info("info")
6 logging.warning("waring")
输出结果:

05/03/2017 10:27:11 AM test INFO info
05/03/2017 10:27:11 AM test WARNING waring

format的日志格式:

   高级用法:

  python使用logging模块记录日志设计的四个主要类:

  A logger:提供应用程序可以直接使用的接口。

1 logger = logging.getLogger("chat.gui")

  1、在输出日志之前都需要获取一个logger,logger通常对应了程序的模块名。

1 logger.setLevel(logging.DEBUG)

  2、设置最低的日志级别,低于lel的级别将被忽略(debug是最低,critical为最高)

  3、logger.addFilter(filt) logger.removeFilter(filt) 添加或删除指定的filter

  4 logger.addHandler(hdlr),logger.removeHandler(hdlr) 添加或删除指定的handler

1 ch = logging.StreamHandler() #创建一个handler,用于输出到控制台
2 logger.addHandler(fh)#给logger添加handler

  5、logger.debug() logger.info() logger.warning() logger.error() logger.critical() ,设置日志的级别

  B handler:将(logger创建的)日志记录发送到合适的目的输出。python的日志系统有很多种handler可以使用,有些handler可以把信息输出到控制台,有些logger可以把信息输出到文件,还有些handler可以信息发送到网络上,如果嫌少,还能编写自己的handler,通过addHandler()方法添加多个handler。

  1 handler.setlevel(lel) 指定被处理的信息级别,低于lel级别的信息将被忽略。

1 ch = logging.StreamHandler()
2 ch.setLevel(logging.DEBUG)

  2 handler.setFormatter() 为该handler设置格式

1 ch_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") #生成格式
2  
3 ch.setFormatter(ch_formatter) #设置格式

  3 logging.StreamHandler(strm) 使用这个handler可以向屏幕输出,其中strm参数是一个文件对象,默认是sys.stderr

  4 logging.FileHandler(filename[,mode]) 用于向一个文件输出日志信息,它会帮你打开这个文件,其中filename是文件名,必须制定.mode是文件的打开方法,默认是'a',即添加到文件末尾。

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

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

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

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

  举例说明:

 1 # create logger
 2 logger = logging.getLogger('TEST-LOG')
 3 logger.setLevel(logging.DEBUG)
 4 
 5 # create console handler and set level to debug
 6 ch = logging.StreamHandler()
 7 ch.setLevel(logging.DEBUG)
 8 
 9 # create file handler and set level to warning
10 fh = logging.FileHandler("access.log")
11 fh.setLevel(logging.WARNING)
12 # create formatter
13 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
14 
15 # add formatter to ch and fh
16 ch.setFormatter(formatter)
17 fh.setFormatter(formatter)
18 
19 # add ch and fh to logger
20 logger.addHandler(ch)
21 logger.addHandler(fh)
22 
23 # 'application' code
24 logger.debug('debug message')
25 logger.info('info message')
26 logger.warn('warn message')
27 logger.error('error message')
28 logger.critical('critical message')
View Code

 

8 re模块

  正则表达式(RE)是一种小型的、高度专业化的编程语言。它被内嵌在python中,并通过re模块实现。

  正则表达式(RE)可以被连接,从而形成新的正则表达式;例如A和B都是正则表达式,那么AB也是正则表达式。

  一般地,如果字符串p与A匹配,q与B匹配的话,那么字符串pq也会与AB匹配,但A或者B里含有边界限定条件或者命名组操作的情况除外。也就是说,复杂的正则表达式可以用简单的连接而成。

  常用表达式符号:

 1 '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
 2 '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
 3 '$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
 4 '*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
 5 '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
 6 '?'     匹配前一个字符1次或0次
 7 '{m}'   匹配前一个字符m次
 8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
 9 '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11  
12  
13 '\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
14 '\Z'    匹配字符结尾,同$
15 '\d'    匹配数字0-9
16 '\D'    匹配非数字
17 '\w'    匹配[A-Za-z0-9]
18 '\W'    匹配非[A-Za-z0-9]
19 's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
20  
21 '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
22 [] 大括号,用于指定一个字符的集合

  常用语法

  1 search(pattern,string,flags = 0) 扫面整个字符串并返回第一个成功的匹配 否则返回none

  2 match(pattern,string,flags = 0) 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回none

   pattern 表示匹配的正则表达式

   string  表示要匹配的字符串

   flags 表示一个标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等

  3 findall(pattern,string,flags=0) 以列表获取字符串中所有匹配到的字符串

       4 sub re.sub(pattern,repl,string,coun=0t,flags=0) 前三者是必选,后两者是可选

     使用repl 代替string中pattern部分

  5 split(pattern,string,maxsplit = 0,flags = 0)

   根据指定匹配进行分组

  对获取的结果,可以做如下处理: 

  1 group() 返回所有匹配的字符,括号里可以加数字1、2、3 ,用于分段

  1 groups() 以列表形式返回匹配到的字符

  注意:r 表示原生字符串,不用担心漏写反斜杠 

9 json 和pickle 

 json 它只能对简单的数据类型进行处理,且它是跨语言的,只能对字符串进行处理  在py2.x中 可以多次load/dump 但是3.x只能 load 和 dump一次

 json.dumps(data,sort_keys ,indent,separators)  把一个python对象编码转成json字符串 --编码

 data 表示数据、sort_keys表示是否排序,indent表示缩进参数、separators表示压缩

 json.loads() 把json格式字符串解码转换成python对象 -- 解码

1 >>>jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
2 >>>s = json.loads(jsonData)
3 >>>print(s["a"])
4 输出 1
1 >>>jsonData = {"a":1,"b":2,"c":3,"d":4,"e":5}
2 >>>s = json.dumps(jsonData)
3 >>>print(type(s))
4 <class 'str'>

 loads()和dumps() 针对内存对象,loads()将python内置数据序列化为字符串,也就是将字典转成str

   注意:如果使用json.loads 进行反序列化,再操作文件时,需要read

import json
with open("test.txt","r") as f:  #以普通模式读
    data = json.loads(f.read())   #用loads反序列化

  load()和dump() 针对文件句柄,dump()将内置类型序列化为json对象后写入文件

  dump() 序列化

import  json
info = {
    'name':"李四",
    "age":250
}
with open("test.txt","w") as f:   #文件以写的方式打开
    json.dump(info,f)    #第1个参数是内存的数据对象 ,第2个参数是文件句柄

 load()反序列化

>>>import json
>>>with open("test.txt","r") as f:   #以读的方式打开文件
 >>>   data = json.load(f)  #输入文件对象
>>>print(data.get("age"))
输出250

  pickle 能处理复杂的数据类型 只能在python中使用.json序列化的是字符,而pickle序列化的是字节

  它有两个常用函数方法,dump() 序列化数据 和load() 反序列化

  

 

 

 

 

 

 

 

 

posted @ 2017-04-05 23:43  会开车的好厨师  阅读(161)  评论(0)    收藏  举报