python基础整理笔记(五)

一. 关于hashlib模块的一些注意点

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

md5生成一个32位的16进制字符;

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,切长度更长。

以MD5为例,一般的计算方法如下:

m = hashlib.md5()
a = ‘test1‘
m.update(bytes(a, encoding=‘utf-8‘))
# hexdigest是输出的16进制的结果
print(m.hexdigest())
# hexdigest的结果用hex来decode之后得到的就是这个
print(m.digest())

但有的时候我们需要对一个大文件求md5值,这时候就无法将整个文件内容读取进内存,需要类似如下处理:

 1 m = hashlib.md5()
 2 read_len = 2 ** 16
 3 with open(file_path) as f:
 4     while True:
 5         buf = f.read(read_len)
 6         if buf:
 7             m.update(buf)
 8         else:
 9             break
10 print(m.hexdigest())

分段一定长度读取整个文件,然后不断update直到全部结束。

另外需要注意的是,上述的各种摘要算法的结果,都不是唯一的,也就是说不同的字符串可能计算出相同结果,这种被称为碰撞。所以不能将之作为一个唯一键来发挥作用。

二. exec和eval的注意点

exec和eval给我们的感觉很相似,都是动态执行一个字符串,但是他们是有明显区别的。

exec是一个语法,并非函数(即类似if, for之类的),它的作用是将收到的字符串作为py代码动态的运行,因此也就没有返回值。

示例如下:

1 >>> exec("for i in range(5):print i")
2 0
3 1
4 2
5 3
6 4

eval是一个方法,是动态计算作为字符串的表达式的值,会返回表达式的结果;也因此非表达式的语句是无法运行的。

示例如下:

 1 # eval无法计算非表达式
 2 >>> eval("for i in range(5):print i")
 3 Traceback (most recent call last):
 4   File "<stdin>", line 1, in <module>
 5   File "<string>", line 1
 6     for i in range(5):print i
 7       ^
 8 SyntaxError: invalid syntax
 9
10
11 # 表达式的结果会直接输出
12 >>> eval(‘5 + a‘, {‘a‘:1})
13 6

三. subprogress模块

subprogress模块用于执行系统命令,类似于os.system, os.spawn*;不过subprogress在现在更推荐,官方文档中说:

可见未来可能会完全抛弃上述两个老的模块。

我写了一个用subprogress.PIPE(本方法适合于执行复杂命令)来执行git clone操作的小方法作为示例如下:

 1 def checkout_codes(git_url, tag_version, user_id, passwd, dst_dir):
 2     PIPE = subprocess.PIPE
 3     git_cmd = "https://%s:%[email protected]%s" % (user_id, passwd, git_url)
 4     process = subprocess.Popen([‘git‘, ‘clone‘, git_cmd, dst_dir, ‘-b‘, tag_version],
 5                                stdout=PIPE, stderr=PIPE)
 6     stdoutput, stderroutput = process.communicate()
 7     if process.poll():
 8         print stdoutput
 9         print stderroutput
10         return False
11     return True

三. configparser模块

onfigparser用于处理特定格式的文件,其本质上是利用open来操作文件。

在python2中configparser库库叫ConfigParse,需要pip来安装

该库实现了操作ini风格类型文件的各种方法。ini风格类型示例如下:

 1 [111]
 2 password = 222
 3 admin_flag = 0
 4
 5 [222]
 6 password = 333
 7 admin_flag = 0
 8
 9 [444]
10 password = 555
11 admin_flag = 1

每个[]代表一个section,下面一个等号对代表这个section的一项属性和值。使用configparser的各种方法示例如下:

 1 cf = configparser.ConfigParser()
 2 # 读取文件
 3 cf.read(‘a.conf‘)
 4
 5 # sections方法返回所有的section名字的列表
 6 for sec in cf.sections():
 7     print(sec)
 8
 9
10 # 增加一个新的section
11 cf.addsection(‘555‘)
12 # 给新的section‘555‘增加属性
13 set(‘555‘, ‘password‘, ‘3232‘)
14
15
16 # 原有的section的属性也可以更改,和增加的方法一致
17 set(‘444‘, ‘password‘, ‘3232‘)
18
19 # 通过get和getint方法之类可以取到一个section的一个属性的值
20 cf.get(‘444‘, ‘password‘)
21 cf.getint(‘444‘, ‘password‘)
22
23 # 通过items可以获得一个section的所有属性
24 cf.items(‘444‘)
25
26
27 # 更改结束以后,用write修改文件
28 cf.write(open(‘a.conf‘, "w")
时间: 2024-11-02 23:27:57

python基础整理笔记(五)的相关文章

python基础整理笔记(二)

一. 列表 1. 创建实例: a = [1,2,3] b = list() 2. 主要支持的操作及其时间复杂度如下: 3. 其他 python中的列表,在内存中实际存储的形式其实是分散的存储,比较类似STL中的vector,会预先分配一定长度的内存,当不够时,会申请新的更大的一块内存,将原有的数据copy过去.删除的情况也是类似的相反情况,所以如果存储的元素数量常有巨变,使用deque来代替比较好.deque是一个双向链表,不会去copy元素. 而从上图中我们也可以看出,判断 x in s的复杂

python基础整理笔记(一)

一. 编码 1. 在python2里,加载py文件会对字符进行编码,需要在文件头上的注释里注明编码类型(不加则默认是ascII). 1 # -*- coding: utf-8 -*- 2 3 print 'hello world' 2. str类型也是经过编码的有各种格式,和unicode字符串之间需要通过decode和encode互相转换.使用示例如下: 1 a = '中文' 2 3 b = a.decode('utfi-8') 4 5 c = b.encode('gb2312') 3. 在p

python基础整理笔记(三)

一. python的几种入参形式:1.普通参数: 普通参数就是最一般的参数传递形式.函数定义处会定义需要的形参,然后函数调用处,需要与形参一一对应地传入实参. 示例: 1 def f(a, b): 2 print(a,b) 3 f(1, 2) 2. 指定参数: 指定参数就是在函数调用时,给传入的实参加上其对应的形参的参数名,这样实参的顺序就可以不用和形参完全一一对应的顺序. 示例: 1 def f(a, b): 2 print(a, b) 3 f(b=1, a=2) 3. 默认参数: 默认参数是

python基础整理笔记(七)

一. python的类属性与实例属性的注意点 1 class TestAtt(): 2 aaa = 10 3 4 def main(): 5 # case 1 6 obj1 = TestAtt() 7 obj2 = TestAtt() 8 print obj1.aaa, obj2.aaa, TestAtt.aaa 9 10 # case 2 11 obj1.aaa += 1 12 print obj1.aaa, obj2.aaa, TestAtt.aaa 13 14 # case 3 15 Te

python基础整理笔记(九)

一. socket过程中注意的点 1. 黏包问题 所谓的黏包就是指,在TCP传输中,因为发送出来的信息,在接受者都是从系统的缓冲区里拿到的,如果多条消息积压在一起没有被读取,则后面读取时可能无法分辨消息之间的分隔,造成读取的时候把前后多条消息的内容连起来读出来,就造成了错误.比较靠谱的解决方式是:一端在发送完消息以后,需要接收一次消息,另一端在第一次接收完消息以后,发送一次消息,这样间隔处理:这样就会保证每次接收的消息都是完整到结束的,因为对方在每次发送完整消息以后,都会接收消息以停止发送.在接

python基础整理笔记(八)

一. python反射的方式来调用方法属性 二. python类的一些注意点 1. 父类的方法里面用到子类的属性方法:其实是子类才会调用实例化调用父类的这个方法,所以不会出错 2. 特殊方法 __call__, 3. 特殊方法__iter__ 4. property, XXX.setter装饰器

python基础篇(五)

python基础篇(五) 算法初识 什么是算法 二分查找算法 ?一:算法初识 A:什么是算法 根据人们长时间接触以来,发现计算机在计算某些一些简单的数据的时候会表现的比较笨拙,而这些数据的计算会消耗大量计算机资源,而且耗时,这个时候就有人对这类计算编写了一些策略,这些策略就是算法.这些策略会加快数据计算时间,大大减少计算机的资源消耗. 在长时间人们编写代码的工作中,一些优秀的算法就被流传下来,但是不是所有的算法都能实现目的一步到位的工作,它只能减少你的代码,提高工作效率,随着知识的不断积累,你会

Python基础知识(五)

# -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : [email protected]# @File : Python基础知识(五).py# @Software : PyCharm Python基础知识(五)今日内容大纲:昨日内容回顾 list: 增:append() insert(index,object) extend() 迭代着追加 删: pop 默认删除最后一个,按照索引去删除,有返回值.

Python基础学习笔记(五)常用字符串内建函数

参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-strings.html 3. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000 Python字符串内建函数同样支持Unicode,常用函数如下表: 方法 描述 string.capitalize() 把字符串的第一个字符大写 string.center(wi