笔记: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:控制输出格式
日志级别
Level | Numeric value | When 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等系统都会用到验证码,要多练习,看似简单,不熟练操作起来还挺麻烦的。