在Python2中,通用的str类型填补了二进制数据的这一角色(特指python3中的bytes类型),由于字符串也只是字节的序列(单独的unicode类型处理宽字符串)。python
在Python2中,为了兼容性而使用b'xxx',可是它与'xxx'是相同的,而且产生一个str,而且,bytes只是str的同义词。在Python3中,这两者都解决了bytes类型之间的差别。Python2中的u'xxx'和 U'xxx' Unicode字符串常量形式在Python3中已经取消了,而是使用'xxx'替代,由于全部的字符串都是Unicode,即使它们包含全部的ASCII字符。app
bytes是一个不可改变的字符序列。
Python 3.0 bytes对象是较小整数的一个序列,其中每一个整数都在0到255之间。在python3中bytes主要用于处理那些没有针对每一个任意文本格式都编码的raw字节数据(图像和声音文件,以及用来与设备接口的打包数据,或者你想要用python的struct模块处理的C程序)。Python3的bytes类型支持几乎str类型所作的全部相同操做:这包括字符串方法、序列操做,甚至re模块模式匹配。ide
bytearray是bytes类型的一个变体,它是可变的而且支持原处修改。
它支持str和bytes所支持的常见的字符串操做,以及和列表相同的不少原处修改操做(例如,append和extend方法, 以及向索引赋值)。ui
python3中的文件I/O通常分为两类:文本文件
和二进制文件
使用建议:
1.若是正在处理图像文件,其余程序建立的、并且必须解压的打包数据,或者一些设 备数据流,则使用bytes和二进制模式文件处理它更合适。若是想要更新数据而不 在内存中产生其副本,也能够选择使用bytearray。this
2.若是要处理的内容实质是文本的内容,例如程序输出、H T M L、国际化文本或 CSV或XML文件,可能要使用str和文本模式文件。编码
Python 3.0下的类型转换:
• str.encode()和bytes(S, encoding)把一个字符串转换为其raw bytes形式,而且
在此过程当中根据一个str建立一个bytes。
• bytes.decode()和str(B, encoding)把raw bytes转换为其字符串形式,而且在此
过程当中根据一个bytes建立一个str。url
>>> S = 'eggs' >>> S.encode() b'eggs' >>> bytes(S, encoding='ascii') b'eggs' >>> B = b'spam' >>> B.decode() 'spam' >>> str(B, encoding='ascii') 'spam'
python2系统编码spa
Python 2.7.10 (default, Jul 30 2016, 19:40:32) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> >>> import sys >>> sys.getdefaultencoding() 'ascii'
python3系统编码code
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.getdefaultencoding() 'utf-8'
若是程序执行的过程当中,遇到下面的报错信息时,能够把Python2的系统编码改成utf-8。orm
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1....
#Python2的系统编码改成utf-8,通常放在文件头 import sys reload(sys) sys.setdefaultencoding('utf-8')
chardet是python的一个第三方库,经常使用于编码识别。
from urllib import request import chardet rawdata = request.urlopen('https://www.baidu.com/').read() tmp = chardet.detect(rawdata) print(tmp) """ {'encoding': 'ascii', 'confidence': 1.0} confidence:检测精确度 encoding:编码形式 """
import chardet with open('text.txt', 'rb') as f: data = f.readline() tmp = chardet.detect(data) print(tmp) """ {'encoding': 'ascii', 'confidence': 1.0} """
对于在脚本文件中编码的字 符串,python默认地使用UTF-8编码,可是,它容许咱们经过包含一个注释来指明想要 的编码,从而将默认值修改成支持任意的字符集。这个注释必须拥有以下的形式,而且 在Python 2.6或Python 3.0中必须做为脚本的第一行或第二行出现:
# -*- coding: latin-1 -*-
pickle模块的Python3版本老是建立一个bytes对象
>>> import pickle >>> pickle.dumps([1, 2, 3]) b'\x80\x03]q\x00(K\x01K\x02K\x03e.' >>> pickle.dumps([1, 2, 3], protocol=0) b'(lp0\nL1L\naL2L\naL3L\na.'
序列化于反序列化(在python2与python3中都生效):
>>> import pickle >>> pickle.dump([1, 2, 3], open('temp', 'wb')) >>> pickle.load(open('temp', 'rb')) [1, 2, 3]
sys/locale模块中提供了一些获取当前环境下的默认编码的方法。
# coding:gbk import sys import locale def p(f): print '%s.%s(): %s' % (f.__module__, f.__name__, f()) # 返回当前系统所使用的默认字符编码 p(sys.getdefaultencoding) # 返回用于转换Unicode文件名至系统文件名所使用的编码 p(sys.getfilesystemencoding) # 获取默认的区域设置并返回元祖(语言, 编码) p(locale.getdefaultlocale) # 返回用户设定的文本数据编码 # 文档提到this function only returns a guess p(locale.getpreferredencoding)