Python-day5

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()

注:只支持目录的压缩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值