流畅的python第4章笔记
文本和字节序列
1.unicode与utf-8的关系 UTF-8就是在互联网上使用最广的一种unicode的实现方式(80%的网站已经使用UTF8),这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了.UTF-8最大的一个特点,就是它是一种变长的编码方式.它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)
2.struct模块提供了一些函数,把字节序列转换成不同类型字段组成的元组(struct.unpack
),还有一些函数用于执行反向转换,把元组转换成字节序列(struct.pack
).struct模块能处理bytes,bytearray和memoryview对象
In [62]: struct.unpack('ii',b'\x0c\x00\x00\x00\r\x00\x00\x00')
Out[62]: (12, 13)
In [63]: struct.pack('ii',12,13)
Out[63]: b'\x0c\x00\x00\x00\r\x00\x00\x00'
In [70]: import struct
In [71]: with open('/Users/3xp10it/Downloads/1.gif','rb') as fp:
...: img=memoryview(fp.read())
In [72]: img
Out[72]: <memory at 0x109972e88>
In [73]: header=img[:10]
In [74]: header
Out[74]: <memory at 0x109c13048>
In [75]: bytes(header)
Out[75]: b'GIF89a\x90\x01\x90\x01'
In [76]: fmt='<3s3sHH'
In [77]: struct.unpack(fmt,header)
Out[77]: (b'GIF', b'89a', 400, 400)
In [78]: del header
In [79]: del img
3.python自带了超过100种编解码器,用于在文本和字节之间相互转换.每个编解码器都有一个名称,如’utf_8’,而且经常有几个别名,如’utf8’,’utf-8’,’U8’.
4.python3允许在源码中使用非ascii标识符.有些人不喜欢这么做.支持始终使用ascii标识符的人认为,这样便于所有人阅读和编辑代码.这些人没切中要害:源码应该便于目标群体阅读和编辑,而不是”所有人”.如果代码属于跨国公司,或者是开源的,想让来自世界各地的人作贡献,那么标识符应该使用英语,也就是说只能使用ascii字符.但是,如果你是巴西的一位老师,那么使用葡萄牙语正确拼写变量和函数名更便于学生阅读代码
In [81]: 笔='钢笔'
In [82]: print(笔)
钢笔
5.utf8的一在优势是,不管设备使用哪种字节序(大端或小端),生成的字节序列始终一致,因此不需要BOM(在文件头部的字节序标记,一些编辑器会给文件加BOM,如notepad).尽管如此,某些windows应用(如notepad)还是会在utf8编码的文件中添加BOM;而且,EXCEL会根据有没有BOM确定文件是不是UTF8编码
6.需要在多台设备中或多种场合下运行的代码,一定不能依赖默认编码.打开文件时始终应该明确传入encoding参数,因为不同的设备使用的默认编码可能不同,有时隔一天也会发生变化
7.eval
会把string表达的内容当作代码执行
In [89]: eval('print(111)')
111
In [90]: a='[1,2]'
In [91]: eval(a)
Out[91]: [1, 2]
8.windows中,locale.getpreferredencoding()
返回的编码是最重要的:这是打开文件的默认编码,也是重定向到文件的sys.stdout/stdin/stderr的默认编码.关于编码默认值的最佳建议是:别依赖默认值