python用input输入列表有缺陷_Python的模块

模块的基本知识点:

1、定义:一个.py文件就是一个模块

2、模块的种类:

(1)Python标准库(内置模块)

(2)第三方模块

(3)应用程序自定义模块

3、调用模块的关键字:

import : 1、执行调用的文件。 2、引用。

补充:

package(包)的基本知识点:

包的两种调用方式:

## 第一种调用方式

from package1.package2 importtest## 第二种调用方式

from package1.package2.test import function

(1)下面介绍第三方模块的调用方式:

1 ## file_模块.py 文件的内容:

2

3 defadd(a,b):4 return a+b5 defsub(a,b):6 return a*b7

8 if __name__ == '__main__': ## 注意:这里只有在文件内才能运行

9 c = add(1,2)10 print(c)

1 importfile_模块2 c = file_模块.add(2,3)3 print(c)

运行结果:   5

(2)Python的内置模块有:

下面逐一介绍各个模块的方法:

1. time模块

1 importtime2

3 #时间戳:

4 print(time.time())5

6 #结构化时间--当地时间

8 print(time.localtime(1585482263.9318557))9 #运行结果:time.struct_time(tm_year=2020, tm_mon=3, tm_mday=29, tm_hour=19, tm_min=44, tm_sec=23, tm_wday=6, tm_yday=89, tm_isdst=0)

10

11 t =time.localtime()12 print(t.tm_year) ## 打印出当地时间的年份

13

14 #结构化时间 -- UTC

15 print(time.gmtime())16 #运行结果:time.struct_time(tm_year=2020, tm_mon=3, tm_mday=29, tm_hour=11, tm_min=50, tm_sec=1, tm_wday=6, tm_yday=89, tm_isdst=0)

17

18 #将结构化时间转化成时间戳

19 print(time.mktime(time.localtime()))20 #运行结果:1585482737.0

21

22 #将结构化时间转化成字符串时间

23 print(time.strftime('%Y--%m--%d %X',time.localtime()))24 #运行结果:2020--03--29 19:57:20

25

26 #将字符串时间转化成结构化时间

27 print(time.strptime('2020--03--29 19:57:20','%Y--%m--%d %X'))28 #运行结果:time.struct_time(tm_year=2020, tm_mon=3, tm_mday=29, tm_hour=19, tm_min=57, tm_sec=20, tm_wday=6, tm_yday=89, tm_isdst=-1)

29

30 print(time.asctime())31 #运行结果:Sun Mar 29 20:00:33 2020

32 print(time.ctime())33

34 importdatetime35 print(datetime.datetime.now())36 #运行结果:2020-03-29 20:02:28.666899

View Code

2.random模块

1 importrandom2

3 ## 从 0-1 随机选出一个小数

4 print(random.random())5

6 ## 从 a-b 随机选出一个整数

7 print(random.randint(1,5))8

9 ## 从 a-b 随机选出一个整数,不包括b

10 print(random.randrange(1,5))11

12 ## 从列表 [11,22,33,44,55] 随机选出一个元素

13 print(random.choice([11,22,33,44,55]))14

15 ## 从列表 [11,22,33,44,55] 随机选出n个元素

16 print(random.sample([11,22,33,44,55],2))17

18 ## 从 a-b 随机选出一个小数

19 print(random.uniform(1,5))20

21 ## 重新排序

22 ret = [1,2,3,4,5]23random.shuffle(ret)24 print(ret)25

26 ## 随机验证码

28 defv_code():29 ret = ''

30 for i in range(4):31 res = random.randint(1,9)32 alf = chr(random.randint(65,122))33 s =str(random.choice([res,alf]))34 ret +=s35 returnret36

37 res =v_code()38 print(res)

View Code

3. json 模块和 pickle 模块

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。

在python中,有专门处理json格式的模块—— json 和 picle模块

Json   模块提供了四个方法: dumps、dump、loads、load

pickle 模块也提供了四个功能:dumps、dump、loads、load

下面依次介绍 json 模块和 pickle 模块:

(一) json模块

dumps 和 dump:

dumps 和 dump 序列化:

dumps 会将对象转化成一个带双引号的字符串

dump 必须传文件描述符,只能用在文件操作中

dumps例子:

1 importjson2 res = {'name':'alex','age':17,'agen':'man'}3 print(res)4 print(json.dumps(res))

运行结果:

1 #{'name': 'alex', 'age': 17, 'agen': 'man'}

2 #{"name": "alex", "age": 17, "agen": "man"}

dump例子:

1 importjson2

3 f_write = open('json_test','w')4 res = {'name':'alex','age':17,'agen':'man'}5 json.dump(res,f_write) ## 这里实际上做了两步操作:1、res_dumps = json.dumps(res)   2、f_write.write(res_dumps)

loads 和 load 反序列:

loads 只完成了反序列化,

load 只接收文件描述符,完成了读取文件和反序列化

loads例子:

1 importjson2 print(type(json.loads('123')))3 print(type(json.loads('[12]')))4 dic = {'name':'alex'}5 dic_dumps =json.dumps(dic)6 print(dic_dumps)7 dic_loads =json.loads(dic_dumps)8 print(type(dic_loads))

运行结果:

1 #

2 #

3 #{"name": "alex"}

4 #

load例子:

1 importjson2 f = open('json_test','r')3 r_read = json.load(f) ## 相当于: 1、r_read = f.read() 2、r_read = json.loads(r_read)

4 print(r_read,type(r_read))

运行结果:

1 #{'name': 'alex', 'age': 17, 'agen': 'man'}

(二)pickle模块

dumps 和 dump:

dumps 和 dump 序列化:

dumps 会将对象转化成一个二进制

dump 必须传文件描述符,只能用在文件操作中

dumps例子:

1 importpickle2 res = '这是一个字符串'

3 res =pickle.dumps(res)4 print(res,'\n',type(res))

运行结果:

1 #b'\x80\x03X\x15\x00\x00\x00\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2q\x00.'

2 #

dump例子:

1 importpickle2 f = open('pickle_test','wb')3 res = '这是pickle_test的内容'

4 pickle.dump(res,f) ## 相当于:1、res = pickle.dumps(res) 2、f.write(res)

loads 和 load 反序列:

loads 只完成了反序列化,

load 只接收文件描述符,完成了读取文件和反序列化

loads例子:

1 importpickle2 res = b'\x80\x03X\x15\x00\x00\x00\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2q\x00.'

3 print(pickle.loads(res))

运行结果:

1 #这是一个字符串

load例子:

1 importpickle2 f = open('pickle_test','rb')3 res =pickle.load(f)4 print(res)

运行结果:

1 #这是pickle_test的内容

(三)python对象(obj) 与json对象的对应关系

+-------------------+---------------+

| Python | JSON |

+===================+===============+

| dict | object |

+-------------------+---------------+

| list, tuple | array |

+-------------------+---------------+

| str | string |

+-------------------+---------------+

| int, float | number |

+-------------------+---------------+

| True | true |

+-------------------+---------------+

| False | false |

+-------------------+---------------+

| None | null |

+-------------------+---------------+

(四)总结

1. json序列化方法:

dumps:无文件操作            dump:序列化+写入文件

2. json反序列化方法:

loads:无文件操作              load: 读文件+反序列化

3. json模块序列化的数据 更通用

picle模块序列化的数据 仅python可用,但功能强大,可以序列号函数

4. json模块可以序列化和反序列化的  数据类型 见  python对象(obj) 与json对象的对应关系表

5. 格式化写入文件利用  indent = 4

4.os模块

os模块是与操作系统交互的一个接口

1os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd3 os.curdir 返回当前目录: ('.')4 os.pardir 获取当前目录的父目录字符串名:('..')5 os.makedirs('dirname1/dirname2') 可生成多层递归目录6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印10os.remove() 删除一个文件11 os.rename("oldname","newname") 重命名文件/目录12 os.stat('path/filename') 获取文件/目录信息13 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"

14 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

15os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:16 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

17 os.system("bash command") 运行shell命令,直接显示18os.environ 获取系统环境变量19os.path.abspath(path) 返回path规范化的绝对路径20os.path.split(path) 将path分割成目录和文件名二元组返回21os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素22os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素23os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False24os.path.isabs(path) 如果path是绝对路径,返回True25os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False26os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False27os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略28os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间29os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间30os.system和os.popen的区别:

os.system返回是否运行成功,成功返回0,失败返回1

os.popen返回shell运行的结果

5.re模块(重点)

正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序员们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。

本小结需要掌握的知识点有:

一、元字符

二、正则表达式的函数

下面分别学习两大知识点:

一、元字符

元字符有 . ^ $ * + {} ? () [ ] |  \

下面依次进行学习:

(1).

进行匹配时,一个.可以代替一个换行符以外的任意字符串,下面例子:

1 importre2 res = 'jksdjaexxofjasklgoasdalexijgjasgiojwoijrwng'

3 ret = re.findall('j..d',res) ## 模糊匹配,这里(..)代替两个除了换行符以外的任意的字符串,假如条件一样,那么结果会出现多个

4 print(ret)5 #运行结果:['jksd']

元字符 .

(2)^

匹配对象开头部分,下面例子:

1 importre2 res = 'jksdjaexxofjasklgoasdalexijgjasgiojwoijrwng'

3 ret = re.findall('^j..d',res) ## 模糊匹配,只能匹配对象开头的部分,若是开头匹配不了则传回一个空列表

4 print(ret)5 #运行结果:['jksd']

元字符 ^

(3)$

匹配对象末尾部分,下面例子:

1 importre2 res = 'jksdjaexxofjasklgoasdalexijgjasgiojwoijrwng'

3 ret = re.findall('rw.g$',res) ## 模糊匹配,只能匹配对象末尾的部分,若是末尾匹配不了则传回一个空列表

4 print(ret)5 #运行结果:['rwng']

元字符 $

(4)*(贪婪匹配)

匹配0次或者多次前面出现的正则表达式,下面例子:

1 importre2 res = 'dddddddddddddddddddddddijodjsgjjjjjjjjjjjjjjjjjj'

3 ret = re.findall('d*',res) ## 模糊匹配,返回一个列表,匹配 0-无穷次 的重复内容

4 print(ret)5 ## 运行结果:['ddddddddddddddddddddddd', '', '', '', 'd', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

元字符 *

(5)+(贪婪匹配)

匹配1次或者多次前面出现的正则表达式,下面例子:

1 importre2 res = 'dddddddddddddddddddddddijodjsgjjjjjjjjjjjjjjjjjj'

3 ret = re.findall('d+',res) ## 模糊匹配,返回一个列表,匹配 1-无穷次 的重复内容

4 print(ret)5 ## 运行结果: ['ddddddddddddddddddddddd', 'd']

元字符 +

注意: * 和 + 都是匹配其前面的那一个字符的重复内容,下面例子:

1 res1 = re.findall('alex*','hello alea alexxxxx123')2 res2 = re.findall('alex+','hello alse aleads')3 print(res1,'分割线--分割线',res2)4 ## 运行结果:['ale', 'alexxxxx'] 分割线--分割线 []

* 和 +

总结: * 和 + 都是贪婪匹配(尽可能匹配)

(6){ }

格式:{ a,b }  精准匹配 a-b 次前面出现的正则表达式

1 importre2 ret1 = re.findall('alex{6}','alexxx') ## 注意:{6} 表示前面的正则表达式必须要出现6次

3 ret2 = re.findall('alex{0,6}','alejjjalexxjjj')4 print(ret1,'\n',ret2)

元字符 {}

运行结果:

1 #[]

2 #['ale', 'alexx']

(7)? (惰性匹配)

匹配0次或者1次前面出现的正则表达式

*和 + 后面加入 ? 可以变成惰性匹配(最多只能匹配一次),下面例子:

1 importre2 res = 'alexxxx alexx alexxxx alexxx'

3 ret1 = re.findall('alex?',res)4 ret2 = re.findall('alex*?',res) ## 将 * 变成惰性匹配

5 ret3 = re.findall('alex+?',res) ## 将 + 变成惰性匹配

6 print(ret1,'\n',ret2,'\n',ret3)

元字符 ?

1 #运行结果:

2 #['alex', 'alex', 'alex', 'alex']

3 #['ale', 'ale', 'ale', 'ale']

4 #['alex', 'alex', 'alex', 'alex']

(8)( ) (分组)

匹配封闭的正则表达式,然后另存为子组,下面例子:

1 importre2 ret1 = re.findall('(abc)+','abcabcabcabcaaabcabc')3 ret2 = re.findall('(?:abc)+','abcabcabcabcaaabcabc') ## 和上式的区别:显示重复(abc)

4 print(ret1,'\n',ret2)

分组元字符 ()

运行结果:

1 #运行结果:

2 #['abc', 'abc']

3 #['abcabcabcabc', 'abcabc']

注意:像"abcabc"这种连在一起的进行分组匹配时,只能匹配出一个['abc']

分组权限比普通权限要高,加(?:)可以去权限

1 importre2 ## 分组权限

3 res = re.findall('d(\d)','abcd123')4 print(res) ##`['1']

5

6 ## 去权限

7 res = re.findall('d(?:\d)','abcd123')8 print(res) ## ['d1']

分组权限

(9) [ ]

1、形式:[..]   匹配来自字符集的任意单个字符

2、形式:[x-y]  匹配x~y范围中的任意单个字符

3、形式:[^x-y]  匹配x~y范围以外的任意单个字符

例子:

1 importre2 ret1 = re.findall('a[bc]d','abcdffabdfffacdffad')3 ret2 = re.findall('[a-z]','abc123abc')4 ret3 = re.findall('[^a-z]','abc123abc')5 print(ret1,'\n',ret2,'\n',ret3)

元字符 []

运行结果:

1 #['abd', 'acd']

2 #['a', 'b', 'c', 'a', 'b', 'c']

3 #['1', '2', '3']

(10) | 管道符

格式: ab|c  匹配 ab 或者 c

例子:

1 importre2 ret = re.findall('ab|c','acabddbddcddab')3 print(ret)

运行结果:

#['c', 'ab', 'c', 'ab']

(11) \ 转义字符

1、转移符可以让无意义的字母变成有意义的符号,也就是下面的特殊功能

下面是转义字符的用法:

2、转移符也可以让有意义的元字符变成无意义的字符串,如"."加上 "\."就可以让"."这个元字符变成一个普通的字符串

下面注意一个现象:

1 importre2 ret = re.findall('c\b','abc abc')3 print(ret)4 #运行结果:[]

分析一下:为什么这里会匹配不出来呢?"\b"不是代表空格吗?

原因是re只是一个模块,如果上述"c\b"直接交给re模块肯定没问题,但是我们是用Python解释器进行解释提交给re模块,而中间的过程由于反斜杠“\b”是有意义的,Python解释器提前把“\b”解释了,后面真正交给re模块的就只剩下“c”了,所以我们可以有两种方法来解决这个问题:

第一种方法:

1 importre2 ret = re.findall('c\\b','abc abc') ## 在 \ 前加入一个 \ ,Python解释器先转义一层,再交给re

3 print(ret)4 #运行结果:['c', 'c']

第二种方法:

转义前加入 r ,r 表示Python解释器不做任何转义

1 importre2 ret = re.findall(r'c\b','abc abc')3 print(ret)4 #运行结果:['c', 'c']

由于第二种方法会比较简单,不用管加入几个反斜杠,所以尽量使用第二种方法。

二、正则表达式的方法

常用的方法有:

1,findall:生成一个列表

2,search:返回值是一个对象,如果匹配不成功就返回一个None

3,match:跟search一样,不过只在最前面匹配

4,split:分隔符,功能比字符串的要强大一些

1 importre2 ##### 常用方法有:

3 #1,findall:生成一个列表

4 #2,search:返回值是一个对象,如果匹配不成功就返回一个None

5 ret = re.search('a','abc')6 print(ret)7 print(ret.group())8 #运行结果:

9 #a

10

11 #3,match:跟search一样,不过只在最前面匹配

12 #4,split:分隔符,功能比字符串的要强大一些

13 ret = re.split('[ab]','abnidsabci') ## 将a和b作为两个分隔符进行分割

14 print(ret)15 ## 运行结果:['', '', 'nids', '', 'ci']

16

17 ## 5,sub:替换

18 ret = re.sub('\d','A','jiosdf1235df485eg1d5ge',5) ## 把字符串里的数字全部换成A,后面可以带参数

19 print(ret)20 ## 运行结果:jiosdfAAAAdfA85eg1d5ge

21 ret = re.subn('\d','A','jiosdf1235df485eg1d5ge') ## 替换,并且返回替换的次数

22 print(ret)23 ## 匹配结果:('jiosdfAAAAdfAAAegAdAge', 9)

24

25 ## 6,compile: 编译成一个对象,生成一个方法,直接调用匹配

26 ret = re.compile('\d+') ## 生成一个对象,直接调用匹配,方便多次调用

27 ret = ret.findall('d54g8ege44')28 print(ret)29 ## 运行结果:['54', '8', '44']

30

31 ## 7,finditer:跟findall一样,区别在于会生成一个迭代器,可以直接用next调用

32 ret = re.finditer('\d+','4df48ge54ge24ge6561ge')33 print(next(ret).group())34 print(next(ret).group())35 print(next(ret).group())36 print(next(ret).group())37 print(next(ret).group())38

39 ######################## 补充:

40 ret = re.findall('www\.(baidu|163)\.com','hoishdwww.baidu.comjisjdwww.163.com46') ## 括号优先匹配,这会优先把括号里面的内容打印出来,打印结果是['baidu', '163']

41 ret1 = re.findall('www\.(?:baidu|163)\.com','hoishdwww.baidu.comjisjdwww.163.com46') ## 这个会去优先级,把www.baidu.com整个都给打印出来['www.baidu.com', 'www.163.com']

42 #ret1 = re.findall(r'www.(?:baidu|163).com','hoishdwww.baidu.comjisjdwww.163.com46')

43 print(ret1,ret)

re模块常用方法

6.sys模块

进度条:

1 importsys,time2 for i in range(10):3 sys.stdout.write('#')4 time.sleep(1)5 sys.stdout.flush()

7、xml 模块

xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

xml的格式如下,就是通过<>节点来区别数据结构的:

1 <?xml version="1.0"?>

2

3

4 2

5 2008

6 141100

7

8

9

10

11 5

12 2011

13 59900

14

15

16

17 69

18 2011

19 13600

20

21

22

23

View Code

下面用xml模块对上面的xml文件进行增删改查:

1 importxml.etree.ElementTree as ET2

3 tree = ET.parse('xml_lesson') ## 打开xml_lesson 这个文件,parse和open相似

4 root = tree.getroot() ## 生成一个根对象

5 print(root.tag) ## 标签名

6

7 ## 遍历xml root根

8 for i inroot:9 print(i.tag) ## 打印各个标签名

10 ## 运行结果:country

11 #country

12 #country

13

14 print(i.attrib) ## 打印各个属性,结果返回一个字典

15 ## 运行结果:{'name': 'Liechtenstein'}

16 #{'name': 'Singapore'}

17 #{'name': 'Panama'}

18

19 for j in i: ## 继续遍历i

20 #print(j.tag)

21 print(j.text) ## 打印文本内容

22 ## 打印结果:2

23 #2008

24 #141100

25 #None

26 #None

27 #5

28 #2011

29 #59900

30 #None

31 #69

32 #2011

33 #13600

34 #None

35 #None

36

37 ## 只遍历year标签

38 for i in root.iter('year'):39 print(i.tag,i.text)40 ## 运行结果:year 2008

41 #year 2011

42 #year 2011

43

44 ## 增删改

45

46 for nood in root.iter('year'):47 #增改

48 new_text = int(nood.text)+1

49 nood.text =str(new_text)50 nood.set('update','yes') ## 增加属性

51 tree.write('xml_lesson.xml') ## 建立和xml文件的联系,重新写入文件中

52

53 #删

54 for country in root.findall('country'):55 rank = int(country.find('rank').text)56 if rank>50:57 root.remove(country)58

59 tree.write('output.xml')

xml增删改查

用xml模块生成一个xml文件:

1 ################################## 生成一个xml的文件对象 ####################################

2 importxml3 importxml.etree.ElementTree as ET4 new_xml = ET.Element('name list')5 name = ET.SubElement(new_xml,'name',attrib={'enrolled':'yes'}) ## new_xml 是对象,name是标签

6 age = ET.SubElement(name,'age',attrib={'checked':'no'})7 sex = ET.SubElement(name,'sex')8 sex.text = '39'

9 name2 = ET.SubElement(new_xml,'name',attrib={'enrolled':'no'})10 age = ET.SubElement(name2,'age',attrib={'check':'yes'})11 age.text = '19'

12 et = ET.ElementTree(new_xml) ##### 把上面的内容写进一个新文档里去,固定格式

13 et.write('test.xml')

xml模块生成一个xml文件

8、configparser模块

config:配置。也就是说这个文件是为了配置文件而开发的

用configparser模块创建一个新的配置文件:

1 importconfigparser2 config = configparser.ConfigParser() ## config = {}

3

4 config['DEFAULT'] ={5 'ServerAliveInterval':'45',6 'Compression':'yes',7 'CompressionLevel':'9'

8 }9 config['DEFAULT']['ForwardX11'] = 'yes'

10

11 config['bitbucket.org'] ={}12 config['bitbucket.org']['User'] = 'hg'

13

14 config['topsecret.server.com'] ={}15 topsecret = config['topsecret.server.com']16 topsecret['Host.Port'] = '50022'

17 topsecret['ForwardX11'] = 'no'

18

19 #写入文件中

20 with open('config_test','w') as configfile:21 config.write(configfile)22 configfile.close()23

24 ################################ 增删改查 ##############################

25 importconfigparser26 config =configparser.ConfigParser()27 print(config.sections()) ## []

28

29 #####################################查--------------------------------------

30 config.read('config_test')31 print(config.sections()) ## 只打印除了默认以外的键值

32 print(config['bitbucket.org']['user'])33 for key in config['bitbucket.org']:34 print(key) ## 会把DEFAULT下的内容都变历出来

35 print(config.options('bitbucket.org')) ## 遍历key值组成一个列表显示出来

36 print(config.items('bitbucket.org')) ## 遍历内容组成一个元祖显示出来

37 print(config.get('bitbucket.org','compression'))38 print(config.get('bitbucket.org','compressionlevel')) ## 取'bitbucket.org'下的'compressionlevel'对应的值

39

40 ###########################################增删--------------------------------------------

41 config.add_section('yuan') ## 增加块

42 config.set('yuan','s1','11111111111111')43 #config.remove_section('bitbucket.org') ## 删除块

44 config.remove_option('topsecret.server.com','host.port') ## 删除键值对

45 config.write(open('config','w'))

configparser创建配置文件

生成的文件:

[DEFAULT]

serveraliveinterval= 45compression=yes

compressionlevel= 9forwardx11=yes

[bitbucket.org]

user=hg

[topsecret.server.com]

forwardx11=no

[yuan]

s1= 11111111111111

配置文件

9、haslib模块

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

1 ###################################### hashlib:加密 ###################################

2 importhashlib3 obj =hashlib.md5()4 obj.update('root'.encode('utf8')) ## 63a9f0ea7bb98050796b649e85481845

5 print(obj.hexdigest())6

7 obj.update('admin'.encode('utf8'))8 print(obj.hexdigest()) ## cd92a26534dba48cd785cdcc0b3e6bd1 注意:这是在原有root基础后面加上了admin

9

10 obj.update('root'.encode('gbk'))11 print(obj.hexdigest()) ## 407e011dea1df3c552d2c49659c0ad27

hashlib

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

1 importhashlib2

3 ######### 256 ########

4

5 hash = hashlib.sha256('898oaFs09f'.encode('utf8'))6 hash.update('alvin'.encode('utf8'))7 print (hash.hexdigest())#e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7

加入自定义key

python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密:

1 importhmac2 h = hmac.new('alvin'.encode('utf8'))3 h.update('hello'.encode('utf8'))4 print (h.hexdigest())#320df9832eab4c038b6c1d7ed73a5940

hmac

10、logging模块(重点)

下面写一个简单的logging文件,并且分成了五个级别,约到后面等级越高

1 importlogging2

3 logging.debug('debug message')4

5 logging.info('info message')6

7 logging.warning('warning message')8

9 logging.error('error message')10

11 logging.critical('critical message')

简单的logging

修改参数:

1 ##--------------------------》 basicConfig 方式

2 importlogging3 logging.basicConfig(4 level=logging.DEBUG, ##修改默认打印值

5 filename= 'logging.log', ## 追加模式,生成一个文件logging.log

6 filemode='w', ## 从追加模式改为覆盖模式

7 format = '%(asctime)s %(filename)s [%(lineno)d] %(message)s' ## 添加参数 lineno-->显示第几行

8 )9 logging.debug('debug message')10 logging.info('info message')11 logging.warning('warning message') ## 默认会打印到warning级别,想要全部打印就需要修改默认值

12 logging.error('error message')13 logging.critical('critical message')

修改参数

生成的文件:

2020-03-31 21:29:13,084 loggingģ��.py [11] debug message2020-03-31 21:29:13,090 loggingģ��.py [12] info message2020-03-31 21:29:13,090 loggingģ��.py [13] warning message2020-03-31 21:29:13,090 loggingģ��.py [14] error message2020-03-31 21:29:13,090 loggingģ��.py [15] critical message

logging.log

如果需要多次使用日志功能,那么就可以写出一个日志功能的函数,直接调用就可以了,且这种方式是用的最多的

1 #-------------------------------> logger 对象

2 deflogger():3 logger =logging.getLogger()4

5 fh = logging.FileHandler('test_log') ## 文件修改

6 ch = logging.StreamHandler() ## 屏幕打印

7

8 fm = logging.Formatter('%(asctime)s %(message)s') ## 自定义格式

9

10 fh.setFormatter(fm) ## 修改设定

11 ch.setFormatter(fm)12

13 logger.addHandler(fh)14 logger.addHandler(ch)15 logger.setLevel('DEBUG') ## 修改默认值

16 #logger.filemode('w')

17 returnlogger18 ## logger对象的设定

19

20 ##------------------------------------

21

22 ## logger对象的调用

23 logger =logger()24 logger.debug('debug')25 logger.info('info')26 logger.warning('warning')27 logger.error('error')28 logger.critical('critical')

logger

format参数中可能用到的格式化串:

%(name)s Logger的名字

%(levelno)s 数字形式的日志级别

%(levelname)s 文本形式的日志级别

%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有

%(filename)s 调用日志输出函数的模块的文件名

%(module)s 调用日志输出函数的模块名

%(funcName)s 调用日志输出函数的函数名

%(lineno)d 调用日志输出函数的语句所在的代码行

%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d 线程ID。可能没有

%(threadName)s 线程名。可能没有

%(process)d 进程ID。可能没有

%(message)s用户输出的消息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值