day11-20180424笔记

笔记:Python复习及模块(logging、os、sys、random、string)

 一、复习

模块(time、datetime、commands)

1、 time时间模块

time模块是包含各方面对时间操作的函数. 尽管这些常常有效但不是所有方法在任意平台中有效

函数

  • time.time(): 返回一个时间戳
  • time.asctime([t]): 转换gmtime()和localtime()返回的元组或struct_time为string.
  • time.clock(): 在第一次调用的时候, 返回程序运行的时间. 第二次之后返回与之前的间隔.
  • time.ctime([secs]): 将时间戳转换为时间字符串, 如没有提供则返回当前的时间字符串,并与asctime(localtime())一样.
  • time.gmtime([secs]): 将时间戳转化为, UTC 时区的struct_time.
  • time.localtime([secs]): 类似gmtime()但会把他转换成本地时区.
  • time.mktime(t): struct_time 转化为时间戳.
  • time.sleep(secs): 线程推迟指定时间, 以秒为单位.
  • time.strftime(format[,t]): 根据参数转换一个sturc_time或元组为字符串.
  • time.strptime(string[, format]): 与strftime相反,返回一个struct_time.

time模块中常用的格式化字符串

  • %y 两位数的年份 00 ~ 99.
  • %Y 四位数的年份 0000 ~ 9999
  • %m 月份 01 ~ 12.
  • %d day 01 ~ 31.
  • %H 时 00 ~ 23.
  • %I 时 01 ~ 12.
  • %M 分 00 ~ 59.
  • %S 秒 00 ~ 61.
# 导入模块
import time

2、datetime时间模块

datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo。

datetime相当于date和time结合起来。
datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )

datetime.today():返回一个表示当前本地时间的datetime对象;
datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
datetime.utcnow():返回一个当前utc时间的datetime对象;#格林威治时间
datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
datetime.combine(date, time):根据date和time,创建一个datetime对象;
datetime.strptime(date_string, format):将格式字符串转换为datetime对象;
from datetime import datetime
print(datetime.now())      #获取当前时间
print(datetime.now().year)     #
print(datetime.now().month)    #
print(datetime.now().day)      #
print(datetime.now().hour)     #
print(datetime.now().minute)     #
print(datetime.now().second)     #
print(datetime.now().strftime("%Y-%m-%d"))     #转换格式为XXXX年-XX月-XX日

以上实例l输出的结果

2018-04-25 20:35:16.029000
2018
4
25
20
35
16
2018-04-25

3、commands命令模块

看一下三个函数:
1). commands.getstatusoutput(cmd)
用os.popen()执行命令cmd, 然后返回两个元素的元组(status, result),其中 status为int类型,result为string类型。cmd执行的方式是{ cmd ; } 2>&1, 这样返回结果里面就会包含标准输出和标准错误.


2). commands.getoutput(cmd)
只返回执行的结果, 忽略返回值.


3). commands.getstatus(file) #现已被弃用
返回ls -ld file执行的结果.

python2才有的模块
import commands
cmd = "ls -lhtr"
(status, ouput) = commands.getstat
    pass
subprocess.call(cmd)

扩展知识:windows、unix、mac操作系统的换行符

(1)在微软的MS-DOS和Windows中,使用“回车CR('
')”和“换行LF('
')”两个字符作为换行符;
(2)Windows系统里面,每行结尾是 回车+换行(CR+LF),即“ ”;
(3)Unix系统里,每行结尾只有 换行CR,即“ ”;
(4)Mac系统里,每行结尾是 回车CR 即' '。

 二、logging、os、sys、random、string

1、logging日志模块

组成

主要分为四个部分:

  • Loggers:提供应用程序直接使用的接口
  • Handlers:将Loggers产生的日志传到指定位置
  • Filters:对输出日志进行过滤
  • Formatters:控制输出格式

日志级别

LevelNumeric valueWhen it’s used
DEBUG 10 Detailed information, typically of interest only when diagnosing problems.
INFO 20 Confirmation that things are working as expected.
WARNING 30 An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
ERROR 40 Due to a more serious problem, the software has not been able to perform some function.
CRITICAL 50 A serious error, indicating that the program itself may be unable to continue running.
NOSET 0 getattr(logging, loglevel.upper())

默认级别是WARNING,可以使用打印到屏幕上的方式记录,也可以记录到文件中。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 20:52
# @Author  : yangyuanqiang
# @File    : demon2.py

'''
日志记录模块
日志的几个级别
debug
info
warning
error
critical
'''

import logging

# 定义日志级别,默认warning以上才会输出告警日志信息
logging.basicConfig(level=logging.DEBUG)



logger = logging.getLogger(__name__)    #本身


def hello():
    print("hello world")

def main():
    logger.info("开始执行main函数")
    print("##"*10)
    hello()
    logger.info("调用hello() 函数")
    try:
        a = 2/0
        f = open("demon1.py", "r")
    except Exception as e:
        logger.error("除数不能为0")
    finally:
        logger.warning("文件没有正常关闭")



main()

以上实例输出的结果,因为定义了日志级别,logging.basicConfig(level=logging.DEBUG) ,所以所有结果都会输出

####################
hello world
INFO:__main__:开始执行main函数
INFO:__main__:调用hello() 函数
ERROR:__main__:除数不能为0
WARNING:__main__:文件没有正常关闭

把 logging.basicConfig(level=logging.DEBUG) 前面添加 # 注释掉,输出的结果,默认级别是WARNING

####################
hello world
除数不能为0
文件没有正常关闭

把日志信息输出到文本里

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 20:52
# @Author  : yangyuanqiang
# @File    : demon2.py

'''
日志记录模块
日志的几个级别
debug
info
warning
error
critical
'''

import logging

# 定义日志级别,默认warning以上才会输出告警日志信息
# logging.basicConfig(level=logging.DEBUG)

# 日志输出格式,在当前目录下生成 myapp.log 存放日志输出信息
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt=' %Y/%m/%d %H:%M:%S', filename='myapp.log', filemode='w')


logger = logging.getLogger(__name__)    #本身


def hello():
    print("hello world")

def main():
    logger.info("开始执行main函数")
    print("##"*10)
    hello()
    logger.info("调用hello() 函数")
    try:
        a = 2/0
        f = open("demon1.py", "r")
    except Exception as e:
        logger.error("除数不能为0")
    finally:
        logger.warning("文件没有正常关闭")



main()

在当前目录下创建一个 myapp.log文件存放日志信息

 2018/04/25 20:48:04 demon2.py[line:33] INFO 开始执行main函数
 2018/04/25 20:48:04 demon2.py[line:36] INFO 调用hello() 函数
 2018/04/25 20:48:04 demon2.py[line:41] ERROR 除数不能为0
 2018/04/25 20:48:04 demon2.py[line:43] WARNING 文件没有正常关闭

2、os模块

os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的

os.name

输出字符串指示正在使用的平台。如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix'。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 21:14
# @Author  : yangyuanqiang
# @File    : demon3.py
'''
os模块
os.name
如果结果为nt, 则为windows系统,
如果结果为posix, 则为unix系统
os.system(cmd)   纯粹的执行系统命令,但是没有返回结果
result = os.popen(cmd)
result.read()  这样你就可以对reuslt进行控制了
os.
'''


import os

# 打印系统名称
print(os.name)

# 判断系统
if os.name == "nt":
    cmd = "ipconfig"
elif os.name == "posix":
    cmd = "ifconfig"

# 打印输出结果
os.system(cmd)

以上实例输出的结果

posix
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
    inet 127.0.0.1 netmask 0xff000000 
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 4c:32:75:95:41:5b 
    inet6 fe80::490:af8d:f6f9:220a%en0 prefixlen 64 secured scopeid 0x4 
    inet 192.168.3.11 netmask 0xffffff00 broadcast 192.168.3.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
    options=60<TSO4,TSO6>
    ether 4a:00:08:07:23:e0 
    media: autoselect <full-duplex>
    status: inactive
en2: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
    options=60<TSO4,TSO6>
    ether 4a:00:08:07:23:e1 
    media: autoselect <full-duplex>
    status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether 4a:00:08:07:23:e0 
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 5 priority 0 path cost 0
    member: en2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 6 priority 0 path cost 0
    nd6 options=201<PERFORMNUD,DAD>
    media: <unknown type>
    status: inactive
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 0e:32:75:95:41:5b 
    media: autoselect
    status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
    ether a6:09:d5:43:e9:5b 
    inet6 fe80::a409:d5ff:fe43:e95b%awdl0 prefixlen 64 scopeid 0x9 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 66:b0:a6:22:45:d7 
    inet6 fe80::62:710c:306e:ea89%en5 prefixlen 64 secured scopeid 0xa 
    inet 169.254.59.221 netmask 0xffff0000 broadcast 169.254.255.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect (100baseTX <full-duplex>)
    status: active
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
    inet6 fe80::7b68:e4e1:bcde:2495%utun0 prefixlen 64 scopeid 0xb 
    nd6 options=201<PERFORMNUD,DAD>

os.getcwd()

函数得到当前工作目录,即当前Python脚本工作的目录路径。

os.listdir()

返回指定目录下的所有文件和目录名。

>>> os.listdir(os.getcwd())
['1.log', '__init__.py', 'demon1.py', 'demon2.py', 'demon3.py', 'demon4.py', 'demon5.py', 'demon6.py', 'myapp.log', 'test']

os.remove()

删除一个文件。

os.system()

运行shell命令

>>> os.system('ls')
每周周测                第七节课函数类          第九节课                第五节课                第六节课                第十节课                系统监控
第一节课                第三节课                第二节课                第八节课装饰器          第十一节课              第四节课                练习题
0

os.sep 可以取代操作系统特定的路径分割符。

os.linesep字符串给出当前平台使用的行终止符

>>> os.linesep
'
'            #Windows使用'
',Linux使用'
'而Mac使用'
'。
>>> os.sep
'\'              #Windows
>>> 

os.path.split()

函数返回一个路径的目录名和文件名

>>> os.path.split("~/Desktop/Python一期直播课/livePython-2018/第十一节课")
('~/Desktop/Python一期直播课/livePython-2018', '第十一节课')

os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目录。

>>> os.path.isdir(os.getcwd())
True
>>> os.path.isfile('a.txt')
False

3、sys系统模块

sys模块的常见函数列表

  • sys.argv: 实现从程序外部向程序传递参数。

  • sys.exit([arg]): 程序中间的退出,arg=0为正常退出。

  • sys.getdefaultencoding(): 获取系统当前编码,一般默认为ascii。

  • sys.setdefaultencoding(): 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding('utf8'),此时将系统默认编码设置为utf8。(见设置系统默认编码 )

  • sys.getfilesystemencoding(): 获取文件系统使用编码方式,Windows下返回'mbcs',mac下返回'utf-8'.

  • sys.path: 获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到。

  • sys.platform: 获取当前系统平台。

  • sys.stdin,sys.stdout,sys.stderr: stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 21:37
# @Author  : yangyuanqiang
# @File    : demon4.py


'''
sys
'''


import sys


# 在当前目录下生成1.log文件,把hello world写入到1.log文件中
f = open("1.log", "w")
sys.stdout = f
print("hello world")

会在当前目录生成 1.log文件

hello world
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 21:37
# @Author  : yangyuanqiang
# @File    : demon4.py


'''
sys
'''


import sys
print(sys.argv[1])  #传参数
print(sys.argv[2])
print(sys.stdout)   #文件类型
sys.stdout.write("allalallala")     #直接打印输出结果

sys.argv[1]和sys.argv[2],要设置pycharm,写入参数,执行时才会传入参数,不然会报错,以上实例输出的结果

aaa
bbb
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
allalallala

4、random随机模块

random.randint
random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

import random

print(random.randint(12, 20))  # 生成的随机数 n: 12 <= n <= 20
print(random.randint(20, 20))  # 结果永远是20

以上实例输出的结果

14
20

andom.randrange
random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效

import random

print(random.randrange(1, 100, 2))

以上实例输出的结果

79

random.sample
random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列

import random

list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
slice = random.sample(list, 5)  # 从list中随机获取5个元素,作为一个片断返回
print(slice)
print(list)  # 原有序列并没有改变

以上实例输出的结果

[5, 6, 3, 9, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

小练习:

随机整数:

代码如下:
>>> import random
>>> random.randint(0,99)
# 21
 

随机选取0到100间的偶数:

代码如下:
>>> import random
>>> random.randrange(0, 101, 2)
# 42
 

随机浮点数:

代码如下:
>>> import random
>>> random.random()
0.85415370477785668
>>> random.uniform(1, 10)
# 5.4221167969800881
 

随机字符:

代码如下:
>>> import random
>>> random.choice('abcdefg&#%^*f')
# 'd'
 

多个字符中选取特定数量的字符:

代码如下:
>>> import random
random.sample('abcdefghij', 3)
# ['a', 'd', 'b']
 

多个字符中选取特定数量的字符组成新字符串:

代码如下:
>>> import random
>>> import string
>>> string.join( random.sample(['a','b','c','d','e','f','g','h','i','j'], 3) ).replace(" ","")
# 'fih'
 

随机选取字符串:

代码如下:
>>> import random
>>> random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] )
# 'lemon'
 

洗牌:

 

代码如下:
>>> import random
>>> items = [1, 2, 3, 4, 5, 6]
>>> random.shuffle(items)
>>> items
# [3, 2, 5, 6, 4, 1]
骰子,判断1,2,3,4,5,6出现的次数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 22:01
# @Author  : yangyuanqiang
# @File    : demon5.py
'''
random
随机模块
'''
import random




# 骰子,判断1,2,3,4,5,6出现的次数
class NumberCount(object):
    def __init__(self):
        self.number1 = 0
        self.number2 = 0
        self.number3 = 0
        self.number4 = 0
        self.number5 = 0
        self.number6 = 0
    def count(self):
        for i in range(1, 6001):
            number = random.randint(1, 6)
            if number == 1:
                self.number1 += 1
            if number == 2:
                self.number2 += 1
            if number == 3:
                self.number3 += 1
            if number == 4:
                self.number4 += 1
            if number == 5:
                self.number5 += 1
            if number == 6:
                self.number6 += 1
    def getResult(self):
        print("1出现的次数: {0}".format(self.number1))
        print("2出现的次数: {0}".format(self.number2))
        print("3出现的次数: {0}".format(self.number3))
        print("4出现的次数: {0}".format(self.number4))
        print("5出现的次数: {0}".format(self.number5))
        print("6出现的次数: {0}".format(self.number6))

if __name__ == "__main__":
    numberCount = NumberCount()
    numberCount.count()
    numberCount.getResult()

以上实例输出的结果

1出现的次数: 1001
2出现的次数: 992
3出现的次数: 1068
4出现的次数: 983
5出现的次数: 945
6出现的次数: 1011

5、string模块

string模块主要用于对字符串进行操作。string里的许多特性都已经移植到str和unicode对象的方法里去了。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 22:17
# @Author  : yangyuanqiang
# @File    : demon6.py

import string

print(string.ascii_letters)     #ascii码小写a-z到大写A-Z
print(string.digits)            #数字
print(string.ascii_lowercase)   #小写a-z
print(string.ascii_uppercase)   #大写A-Z
print(string.printable)         #可打印的字符
print(string.punctuation)       #特殊字符
print(string.hexdigits)         #16进制

以上实例输出的结果

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[]^_`{|}~     

!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
0123456789abcdefABCDEF

随机生成6位验证码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/25 22:17
# @Author  : yangyuanqiang
# @File    : demon6.py
import random
import string




# 随机打印6位验证码
print("".join(random.sample(string.ascii_letters + string.digits, 6)))

以上实例输出的结果

aU2Owc

总结:

1、熟练time、datetime时间模块,因为在写代码过程中,会使用到;

2、os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的;

3、random随机模块和string字符串模块,也用的多,比如:360、12306等系统都会用到验证码,要多练习,看似简单,不熟练操作起来还挺麻烦的。

原文地址:https://www.cnblogs.com/ivan-yang/p/8946994.html