1.hashlib模块
#!/usr/bin/env python3
# this is CR7 scripts!
import hashlib
m = hashlib.md5()
m.update(b"charlie")
print(m.hexdigest())
##############################
bf779e0933a882808585d19455cd7937
注:字符串md5转换
2.md5字符串加密
#!/usr/bin/env python3
# this is CR7 scripts!
import hashlib
m = hashlib.md5()
m.update(b"charlie")
print(m.hexdigest())
m.update(b"_CR7")
print(m.hexdigest())
m2 = hashlib.md5()
m2.update(b"charlie_CR7")
print(m2.hexdigest())
###################################
bf779e0933a882808585d19455cd7937
15f5fb5d3342b17b9f54640dca5d0475
15f5fb5d3342b17b9f54640dca5d0475
注:会发现第二行和第三行输出的MD5结果是一样的,这表明当进行字符串或者文件每行内容进行MD5计算的时候,一次性打开文件所有内容然后MD5以及循环读取每一行内容计算MD5最终得到最后一行内容的MD5的值是一样的,只是在进行内存的消耗以及计算时间问题的长短不一样
3.hmac加密传输
#!/usr/bin/env python3
# this is CR7 scripts!
import hmac
h_obj = hmac.new(b"charlie",b"cr7")
print(h_obj.hexdigest())
#####################################
d236530f3864598ced5e59b72870eb69
注:官方的描述是更为安全且速率比sha512等加密算法更迅速的加密方式,常用于网络消息加密的传输
4.log日志模块
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
logging.warning("user [charlie] attempted wrong password more than 3 times")
logging.critical("firewalld is stop")
注:输出日志的标准模块,运维人员必备!
5.log模块五级别
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
logging.debug("yes")
logging.info("yes")
logging.warning("yes")
logging.error("yes")
logging.critical("yes")
6.日志输出且写入文件记录
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
logging.basicConfig(filename="app.log",level=logging.DEBUG)
logging.warning("No!!!")
logging.error("Please no!!!")
logging.debug("Please don't be do it!!")
logging.critical("123")
logging.info("NONONO!!!")
####################################
<查看生成的文件即可看到效果>
注:需要注意的是log模块日志分级别,低于某个级别的信息将不会被输出,级别最低的是debug,最高的是critical
7.显示时间的日志输出文件
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
logging.basicConfig(filename='app.log',level=logging.INFO,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning("No!!!")
logging.error("Please no!!!")
logging.debug("Please don't be do it!!")
logging.critical("123")
logging.info("NONONO!!!")
##########################################
02/14/2017 09:41:06 PM No!!!
02/14/2017 09:41:06 PM Please no!!!
02/14/2017 09:41:06 PM 123
02/14/2017 09:41:06 PM NONONO!!!
8.显示日志级别以及启动日志的文件
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
logging.basicConfig(filename='app.log',level=logging.INFO,format='%(asctime)s - %(thread)d - %(module)s - %(funcName)s : %(lineno)d:%(pathname)s-%(levelname)s: %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning("No!!!")
logging.error("Please no!!!")
logging.debug("Please don't be do it!!")
logging.critical("123")
logging.info("NONONO!!!")
def test():
logging.warning("NNNNNN")
test()
##################################################
02/15/2017 09:31:29 AM - 5356 - test - <module> : 6:C:/Users/dabin/PycharmProjects/dabin/test.py-WARNING: No!!!
02/15/2017 09:31:29 AM - 5356 - test - <module> : 7:C:/Users/dabin/PycharmProjects/dabin/test.py-ERROR: Please no!!!
02/15/2017 09:31:29 AM - 5356 - test - <module> : 9:C:/Users/dabin/PycharmProjects/dabin/test.py-CRITICAL: 123
02/15/2017 09:31:29 AM - 5356 - test - <module> : 10:C:/Users/dabin/PycharmProjects/dabin/test.py-INFO: NONONO!!!
02/15/2017 09:31:29 AM - 5356 - test - test : 13:C:/Users/dabin/PycharmProjects/dabin/test.py-WARNING: NNNNNN
注:log模块还有许多的功能选项,例如列出调用日志的函数名,进程ID,行号,时间等等
9.同时在屏幕和文件中输出日志
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
logger = logging.getLogger('test-log')
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
fh = logging.FileHandler("tandabin.log")
fh.setLevel(logging.WARNING)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(fh)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
######################################
2017-02-15 10:21:21,532 - test-log - DEBUG - debug message
2017-02-15 10:21:21,532 - test-log - INFO - info message
2017-02-15 10:21:21,532 - test-log - WARNING - warn message
2017-02-15 10:21:21,533 - test-log - ERROR - error message
2017-02-15 10:21:21,533 - test-log - CRITICAL - critical message
##############################################
<文件中>
2017-02-15 10:21:21,532 - test-log - WARNING - warn message
2017-02-15 10:21:21,533 - test-log - ERROR - error message
2017-02-15 10:21:21,533 - test-log - CRITICAL - critical message
注:logger提供了应用程序可以直接使用的接口,handler将(logger创建的)日志记录发送到合适的目的输出;logger提供了应用程序可以直接使用的接口;Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高;Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler;Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略;Handler.setFormatter():给这个handler选择一个格式:
logging.StreamHandler(屏幕输出)
logging.FileHandler(文件输出)
10.通过文件切割管理日志输出
#!/usr/bin/env python3
# this is CR7 scripts!
import logging
from logging import handlers
logger = logging.getLogger(__name__)
log_file = "file_log"
fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.warning("test1")
logger.warning("test12")
logger.warning("test13")
logger.warning("test14")
logger.warning("test16")
logger.warning("test15")
##########################################
<文件1>
2017-02-15 11:02:35,768 test:19 test15
#########################################
<文件2>
2017-02-15 11:02:35,760 test:18 test16
#########################################
<文件3>
2017-02-15 11:02:35,753 test:17 test14
###########################################
2017-02-15 11:02:35,747 test:16 test13
注:备份3分,大小为10bytes,超出的部分不会记录在日志里面,余下的平均分散在四个文件中,这就是日志的切割用法
11.通过时间间隔记录以及分割日志
#!/usr/bin/env python3
# this is CR7 scripts!
import logging,time
from logging import handlers
logger = logging.getLogger(__name__)
log_file = "timelog.log"
fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)
formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.warning("test1")
time.sleep(2)
logger.warning("test2")
time.sleep(2)
logger.warning("test3")
time.sleep(2)
logger.warning("test4")
logger.warning("test5")
################################
<文件1>
2017-02-15 11:23:02,126 test:26 test4
2017-02-15 11:23:02,130 test:27 test5
##################################
<文件2>
2017-02-15 11:22:56,124 test:20 test1
2017-02-15 11:22:58,125 test:22 test2
2017-02-15 11:23:00,125 test:24 test3
12.re正则表达式模块\w
>>> a = re.match("\w+","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'inet'
注:match用法是从头开始匹配,\w的意思是匹配[A-Za-z0-9],+代表匹配多个字符,需要注意的是\W是匹配非[A-Za-z0-9]
13.表达式.
>>> a = re.match(".","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'i'
>>> a = re.match(".+","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255'
>>>
注:+的用法是将前面匹配规则的用法重复多次,.+则是多次匹配任意一个字符
14.表达式返回none
>>> a = re.match("\w*","!inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
''
>>> a = re.match("\w+","!inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> print(a)
None
注:如果返回none相当于没有匹配到这条规则,所以没有调用到方法group,*和+的区别则是前者匹配0个到多个,后者是匹配1个到多个,所以第一条正大表达式属于匹配到了,只是为null值而已,而第二条表达式如果没有匹配到1条以上,那么没有匹配成功,所以是none,这里要分清楚区别!
15.表达式?
>>> a = re.match("\w","!inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> print(a)
None
>>> a = re.match("\w?","!inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> print(a)
<_sre.SRE_Match object; span=(0, 0), match=''>
注:?的用法只有一个作用,就是匹配前一个表达式规则的0个或者1个,也就是说允许任何匹配规则匹配0个也不返回none值
16.表达式{x}
>>> a = re.match(".{5}","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'inet '
>>>
注:前面的匹配规则限制匹配次数为x次
17.表达式{x,y}
>>> a = re.match("\w{1,8}","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'inet'
注:还可以写范围
18.表达式|
>>> a = re.match("inet|in","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'inet'
>>> a = re.match("inssset|in","inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'in'
注:匹配|左边或者右边的字符
19.分组匹配
>>> re.search("(\d{6})(\d{8})","44567733456612236").groups()
('445677', '33456612')
注:\D匹配非数字,s匹配非空字符
20.数字开头数字结尾正则表达式
>>> a = re.search("^\d.*\d$","254124123412341asfasfa!!!11")
>>> a.group()
'254124123412341asfasfa!!!11'
注:在Python中以…结尾建议使用\Z,效果等同于$
21.附带标签的分组正则表达式
>>> re.search("(?P<special>[0-9]{6})(?P<birthday>[0-9]{8})(?P<province>[0-9][2])","223345562017021462").groupdict()
{'province': '62', 'special': '334556', 'birthday': '20170214'}
22.全局搜索
>>> re.findall("\d+","aabs112sada1asfa22")
['112', '1', '22']
注:符合匹配要求的全部都输出出来
23.一次性搜索
>>> a = re.search("(\d{1,3}.){3}(\d{1,3})","inet 192.168.122.214 netmask 255.255.255.0 broadcast 10.0.0.255")
>>> a.group()
'192.168.122.214'
注:只匹配第一条符合规则的条目,然后输出
24.取反匹配
>>> re.findall("[a-z,A-Z]+","aabs112sada1asfa22AA")
['aabs', 'sada', 'asfa', 'AA']
>>> re.findall("\D+","aabs112sada1asfa22")
['aabs', 'sada', 'asfa']
25.split分隔符
>>> re.findall("\D+","aabs112sada1asfa22a")
['aabs', 'sada', 'asfa', 'a']
>>> re.split("\d+","aabs112sada1asfa22a")
['aabs', 'sada', 'asfa', 'a']
>>> re.split("\d+","aabs112sada1asfa22")
['aabs', 'sada', 'asfa', '']
注:注意split当匹配最后一个字符符合规则是也会分割成空字符
26.表达式sub
>>> re.sub("\d+","|","aabs112sada1asfa22",count=1)
'aabs|sada1asfa22'
27.反斜杠转译匹配
>>> re.split("\\\\",r"C:\Users\\dabin\AppData\Local")
['C:', 'Users', '', 'dabin', 'AppData', 'Local']
注:之所以加r是因为将r后面的内容转换成只读字符,否则会将后面路径的斜杠识别成转译功能
28.忽略大小写
>>> re.search("a","ABC")
>>> re.search("a","ABC",flags=re.I)
<_sre.SRE_Match object; span=(0, 1), match='A'>
注:re.I就是忽略大小写的功能
29.flags re.S表达式
>>> re.search(".*","ABCafasaa123\n",flags=re.S)
<_sre.SRE_Match object; span=(0, 13), match='ABCafasaa123\n'>
30.自定义验证码
#!/usr/bin/env python3
# this is CR7 scripts!
import string,random
str_ran = string.ascii_letters + string.digits
random_str = random.sample(str_ran,7)
print("".join(random_str))
#################################################
IqWSKL9
31.随机数
#!/usr/bin/env python3
# this is CR7 scripts!
import random
print(random.random())
print(random.randint(1,2))
print(random.randrange(1,2))
##############################
0.14264600406949524
2
1
注:第三条条目和第二条条目唯一的区别是后者不会输出2
32.“伪”序列化
#!/usr/bin/env python3
# this is CR7 scripts!
testdict = {
"name" : "charlie",
"age" : "21",
"sex" : "man"
}
f = open('testfile','w',encoding="UTF-8")
f.write(str(testdict))
f.flush()
f.close()
f = open('testfile','r',encoding="UTF-8")
datadict = eval(f.read())
print(datadict["name"])
###############################################
charlie
注:变相的保存持久化字典的信息
33.json序列化写入字典
#!/usr/bin/env python3
# this is CR7 scripts!
import json
testdict = {
"name" : "charlie",
"age" : "21",
"sex" : "man"
}
f = open('testfile','w',encoding="UTF-8")
f.write(json.dumps(testdict))
#############################################
<testfile>
{"name": "charlie", "age": "21", "sex": "man"}
34.json序列化读取字典
#!/usr/bin/env python3
# this is CR7 scripts!
import json
f = open('testfile','r',encoding="UTF-8")
data = json.loads(f.read())
print(data["sex"])
print(type(data))
##############################################
man
<class 'dict'>
35.pickle序列化写入
#!/usr/bin/env python3
# this is CR7 scripts!
import pickle
def hi(name):
print("name1:",name)
testdict = {
"name" : "charlie",
"age" : "21",
"sex" : hi
}
f = open('testfile','wb')
f.write(pickle.dumps(testdict))
注:用法和json完全一样,不过pickle能够处理更为复杂的数据类型(Python所有数据类型),而同样的用户跨平台的数据交互只有json能够做到,所以json只能够处理简单的数据类型
36.pickle读取
#!/usr/bin/env python3
# this is CR7 scripts!
import pickle
def hi(name):
print("name2:",name)
f = open('testfile','rb')
data = pickle.loads(f.read())
print(data)
print(data["sex"]("CR7"))
注:{‘name’: ‘charlie’, ‘age’: ‘21’, ‘sex’: }
name2: CR7
None
37.shelve写入
#!/usr/bin/env python3
# this is CR7 scripts!
import shelve
def hi(name):
print("name1:",name)
testdict = {
"name" : "charlie",
"age" : "21",
"sex" : hi
}
f = shelve.open('testfile')
f["dict"] = testdict
f["func"] = hi
#################################
<会生成三个文件>
注:语法和pickle完全一样,但是区别是可以多次dump
38.shelve读取
#!/usr/bin/env python3
# this is CR7 scripts!
import shelve
def hi(name):
print("name2:",name)
d = shelve.open('testfile')
print(d["func"]("CR7"))
print(d["dict"])
######################################
name2: CR7
None
{'name': 'charlie', 'age': '21', 'sex': <function hi at 0x0000000002083E18>}
注:可以load多次
39.时间模块
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
print(time.asctime())
##################################
Mon Feb 27 15:06:33 2017
注:输出当前日期,不过格式是国外的格式
补:time.slepp并不占用CPU的计算时间,相当于CPU把这个任务挂起了
40.localtime(本地时间)
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
print(time.localtime())
#
time.struct_time(tm_year=2017, tm_mon=2, tm_mday=27, tm_hour=15, tm_min=12, tm_sec=42, tm_wday=0, tm_yday=58, tm_isdst=0)
41.Unix元年时间戳
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
print(time.time()/(3600*24*365))
####################################
47.189866477312826
注:从Unix诞生元年(1970年)到现在过了xx年
42.gmtime(UTC时间)
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
print(time.gmtime())
#######################################
time.struct_time(tm_year=2017, tm_mon=2, tm_mday=27, tm_hour=7, tm_min=16, tm_sec=15, tm_wday=0, tm_yday=58, tm_isdst=0)
注:注意小时的输出和上文不一致,本地时间和UTC时间的区别
43.基于本地时间的数学运算
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
print(time.localtime())
print(time.localtime(time.time()+3600))
#######################################
time.struct_time(tm_year=2017, tm_mon=2, tm_mday=27, tm_hour=15, tm_min=20, tm_sec=10, tm_wday=0, tm_yday=58, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=2, tm_mday=27, tm_hour=16, tm_min=20, tm_sec=10, tm_wday=0, tm_yday=58, tm_isdst=0)
注:只接受second的值传入
44.字符串到时间戳的转换
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
string_2_struct = time.strptime("2016/05/11","%Y/%m/%d") # 将日期字符串转化成时间对象格式
struct_2_stamp = time.mktime(string_2_struct)
print(struct_2_stamp) # 将时间对象转换成时间戳
print("*".center(50,"-"))
stamp_2_struct = time.localtime(struct_2_stamp) # 将时间戳转换成时间对象
struct_2_string = time.strftime("%Y_%m_%d.log",stamp_2_struct) # 将时间对象转换成字符串
print(struct_2_string)
################################################################################
1462896000.0
------------------------*-------------------------
2016_05_11.log
45.输出中国格式的当前时间
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime,re
get_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #输出格式的转换
print(get_time)
now_time = datetime.datetime.now()
print(now_time)
##############################################
2017-02-27 16:22:15
2017-02-27 16:22:15.907019
46.时间运算
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
now_time = datetime.datetime.now()
print(now_time)
print(now_time+datetime.timedelta(3)) # 当前时间+3天
print(now_time+datetime.timedelta(-3)) # 当前时间-3天
print(now_time+datetime.timedelta(minutes=30)) # 当前时间+30分
##############################################################
2017-02-27 16:24:39.156209
2017-03-02 16:24:39.156209
2017-02-24 16:24:39.156209
2017-02-27 16:54:39.156209
47.时间快速替换
#!/usr/bin/env python3
# this is CR7 scripts!
import time,datetime
now_time = datetime.datetime.now()
print(now_time)
print(now_time.replace(minute=3,hour=2))
############################################
2017-02-27 16:25:31.852401
2017-02-27 02:03:31.852401
48.shutil文件复制1
#!/usr/bin/env python3
# this is CR7 scripts!
import shutil
f1 = open('test1')
f2 = open('test2','w')
shutil.copyfileobj(f1,f2)
注:将f1的内容复制到新文件f2中
49.shutil文件复制2
#!/usr/bin/env python3
# this is CR7 scripts!
import shutil
shutil.copy('test2','test3')
50.copytree
#!/usr/bin/env python3
# this is CR7 scripts!
import shutil
shutil.copytree(r'E:\python','homework')
注:相当于linux下的cp -arp
51.压缩模块zipfile
#!/usr/bin/env python3
# this is CR7 scripts!
import zipfile
zip_obj = zipfile.ZipFile(r"C:\testblock.zip","w")
zip_obj.write(r"C:\testblock")
zip_obj.close()
注:只能压缩文件
52.解压缩
#!/usr/bin/env python3
# this is CR7 scripts!
import zipfile
zip_obj = zipfile.ZipFile(r"C:\testblock.zip","r")
zip_obj.extractall(path=r"C:\\")
zip_obj.close()
53.打包并压缩
#!/usr/bin/env python3
# this is CR7 scripts!
import tarfile,zipfile
tar_obj = tarfile.open(r"C:\test.tar","w")
tar_obj.add(r'F:\python',arcname="CR7")
tar_obj.add(r'C:\testblock')
tar_obj.close()
zip_obj = zipfile.ZipFile(r"C:\test.zip","w")
zip_obj.write(r"C:\test.tar")
zip_obj.close()
注:利用tar可以打包目录和文件,然后将打包出来的一个文件进行压缩,这就解决了zipfile不能加压缩目录的问题
54.解压缩目录
#!/usr/bin/env python3
# this is CR7 scripts!
import shutil
shutile_obj = shutil.make_archive(r"C:\test.zip","zip",r"F:\python")
-------------------------------------------------------
#!/usr/bin/env python3
# this is CR7 scripts!
import zipfile
zipfile_obj = zipfile.ZipFile(r"C:\testblock.zip","r")
zipfile_obj.extractall(r"C:\\")
zipfile_obj.close()
注:只支持目录的压缩