2018年4月26日笔记
Posted Karlkiller
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018年4月26日笔记相关的知识,希望对你有一定的参考价值。
- 内置模块:hashlib
Python的hashlib提供了常见的摘要算法,如md5,sha1, sha224, sha256, sha384, sha512等等,其中md5最为常用。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。md5算法得到的就是一个32位的16进制字符串。
一般用法如下:(python3环境中)
1 import hashlib 2 3 # python3 4 m1 = hashlib.md5() 5 m2 = hashlib.md5() 6 s1 = "abc123" 7 s2 = bytes(s1.encode("utf8")) # 将s1从string类型转为bytes类型 8 print(s2) 9 print(type(s2)) 10 11 m1.update(s1.encode("utf8")) 12 print(m1.hexdigest()) 13 m2.update(s2) # 分别对s1和s2进行md5算法,得到的结果相同 14 print(m2.hexdigest())
b‘abc123‘ <class ‘bytes‘> e99a18c428cb38d5f260853678922e03 e99a18c428cb38d5f260853678922e03
python2与python3的区别在于:python2无需指定编码方式
1 import hashlib 2 3 # python3 4 print(hashlib.md5("a12".encode("utf8")).hexdigest()) 5 6 # python2 7 print(hashlib.md5("a12").hexdigest()) # python2不同于python3,无需指定编码方式
注意:如果同一个hash对象重复调用该方法,则m.update(a); m.update(b) 等效于 m.update(a+b)
例如:对字符串"a12"进行md5算法,有以下3种写法,得到的结果是一样的
1 import hashlib 2 3 # 方法一 4 m3 = hashlib.md5() 5 m3.update("a12".encode("utf-8")) 6 print(m3.hexdigest()) 7 8 # 方法二 9 print(hashlib.md5("a12".encode("utf8")).hexdigest()) 10 11 # 方法三 12 m3 = hashlib.md5(b"a") # 字符串前加b表示为二进制字符串,无需再指定编码方式 13 m3.update("12".encode("utf8")) 14 print(m3.hexdigest()) 15 16 # 备注:字符串前加u,表示字符串以Unicode格式进行编码,即unicode字符串 17 # 备注:字符串前加b,表示为二进制字符串 18 # 备注:字符串前加r,声明该字符串为普通字符串,即不含转义字符 \n \r 之类的
ed20a959d410ccd843d9e1dfcee04228
ed20a959d410ccd843d9e1dfcee04228
ed20a959d410ccd843d9e1dfcee04228
- 内置模块:StringIO , BytesIO
StringIO模块:主要用于在内存中读写字符串数据(string)
BytesIO模块:实现了在内存中读写二进制数据(bytes)
StringIO经常被用来作为字符串的缓存,应为StringIO有个好处,他的有些接口和文件操作是一致的,也就是说用同样的代码,可以同时当成文件操作或者StringIO操作。
StringIO类中常用的方法有如下这些:
- read
- readline
- readlines
- write
- writeline
- getvalue
- truncate
- tell
- seek
- close
- isatty
- flush
----------------------
s.read([n])
参数n限定读取长度,int类型;缺省状态为从当前读写位置读取对象s中存储的所有数据。读取结束后,读写位置被移动。
----------------------
s.readline([length])
参数length限定读取的结束位置,int类型,缺省状态为None:从当前读写位置读取至下一个以“\n”为结束符的当前行。读写位置被移动。
----------------------
s.readlines([sizehint])
参数sizehint为int类型,缺省状态为读取所有行并作为列表返回,除此之外从当前读写位置读取至下一个以“\n”为结束符的当前行。读写位置被移动。
----------------------
s.write(s)
从读写位置将参数s写入给对象s。参数s为str或unicode类型。读写位置被移动。
----------------------
s.writelines(list)
从读写位置将list写入给对象s。参数list为一个列表,列表的成员为str或unicode类型。读写位置被移动。
----------------------
s.getvalue()
此函数没有参数,返回对象s中的所有数据。
----------------------
s.truncate([size])
从读写位置起切断数据,参数size限定裁剪长度,缺省值为None。
----------------------
s.tell()
返回当前读写位置。
----------------------
s.seek(pos[,mode])
移动当前读写位置至pos处,可选参数mode为0时将读写位置移动至pos处,为1时将读写位置从当前位置起向后移动pos个长度,为2时将读写位置置于末尾处再向后移动pos个长度;默认为0。
----------------------
s.close()
释放缓冲区,执行此函数后,数据将被释放,也不可再进行操作。
----------------------
s.isatty()
此函数总是返回0。不论StringIO对象是否已被close()。
----------------------
s.flush()
刷新内部缓冲区。
----------------------
1 from io import StringIO, BytesIO 2 3 s = StringIO() 4 s.write("Hello") 5 s.write("\n") 6 s.write(r"\n") 7 s.write("\nworld") 8 print(s.getvalue()) # 获取内存中的数据 9 print(len(s.getvalue())) 10 11 s.truncate(10) # 获取内存中的数据,0表示清空 12 print("截取上文前10个字符为:\n{0}".format(s.getvalue()))
Hello \n world 14 截取上文前10个字符为: Hello \n w
Python3 中,内存读写字符串数据用StringIO,内存读写二进制数据用BytesIO,bytes和str转换用encode和decode
1 from io import StringIO, BytesIO 2 3 a = "中文" 4 b = a.encode("utf8") 5 print("{0}\n原始内容的类型为:{1}".format(a, type(a))) 6 print("\n{0}\n编码后内容的类型为:{1}".format(b, type(b))) 7 8 c = b.decode("utf8") 9 print("\n{0}\n解码后内显示为原始内容,其类型为:{1}".format(c, type(c)))
中文 原始内容的类型为:<class ‘str‘> b‘\xe4\xb8\xad\xe6\x96\x87‘ 编码后内容的类型为:<class ‘bytes‘> 中文 解码后内显示为原始内容,其类型为:<class ‘str‘>
- 内置模块:json
JSON(javascript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式
json最广泛的应用是作为AJAX中web服务器和客户端通讯的数据格式,也常用语http请求中,so it‘s very import to learn JSON
json模块有 dumps、loads、dump、load四种方法,带s是处理字符串的,不带s是处理文件的
loads : str -> PythonObject
dumps : PythonObject -> str
load : file -> PythonObject
dump : PythonObject -> file
Python对象 与 JSON对象 的对应关系:
+-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
loads()和dumps()用法示例:
1 import json 2 3 obj = dict({"a":1, "b":2}) 4 5 t1 = ‘[{"a":1, "aa":11}, {"b":2}, {"ccc":333}]‘ # json串内部一般用建议用 "双引号",也能用 ‘单引号‘ 6 t2 = ‘‘‘{"aa":11, "b":2}‘‘‘ # json串外部不能用 "双引号" 7 8 t11 = json.loads(t1) # 将其转为list 9 print(t11) 10 print(type(t11)) 11 12 t22 = json.loads(t2) # 将其转为dict 13 print(t22) 14 print(type(t22)) 15 print("\n") 16 17 print("*"*20) 18 print("使用dumps() 转为 str") 19 x = json.dumps(t22) 20 print(type(x)) 21 print("再用loads() 转回原对象obj") 22 print(type(json.loads(x))) 23 24 # dumps()和str()都将能obj转为str,但dumps()可逆 25 26 print("*"*20) 27 print("使用str() 强制转化为 str") 28 y = str(t22) 29 print(type(y)) 30 print("无法使用dict() 强制转回原对象obj") 31 # print(dict(y))
[{‘a‘: 1, ‘aa‘: 11}, {‘b‘: 2}, {‘ccc‘: 333}] <class ‘list‘> {‘aa‘: 11, ‘b‘: 2} <class ‘dict‘> ******************** 使用dumps() 转为 str <class ‘str‘> 再用loads() 转回原对象obj <class ‘dict‘> ******************** 使用str() 强制转化为 str <class ‘str‘> 无法使用dict() 强制转回原对象obj
load()和dump()用法示例:
1 import json 2 import codecs 3 4 test = {"a": 1, "b": 2} 5 with codecs.open("1.txt", "w") as f: 6 json.dump(test, f) 7 with codecs.open("1.txt", "r") as f: 8 obj = json.load(f) 9 print(obj) 10 print(type(obj))
{‘a‘: 1, ‘b‘: 2} <class ‘dict‘>
以上是关于2018年4月26日笔记的主要内容,如果未能解决你的问题,请参考以下文章