python中有两种字符串对象,即str和unicode。
一个简单的演示:
s1 = 'abcdefg'u1 = u'abcdefg'print s1print u1type(s1)type(u1)
返回得到:
abcdefgabcdefg<type 'str'><type 'unicode'>
可见,虽然s1和u1两个变量看似内容和输出一致,但是类型却完全不同。
它们二者的方法适用性也可能完全不同。当有报错提示,
ValueError: Expected a bytes object, not a unicode object
说明不能传入unicode对象,需要将unicode转换为str对象.
str和unicode互相转换
python内部常用unicode对象处理,比如io.read()方法返回的即为unicode对象,往往需要将其转换为str对象。有时也需要将str转换为unicode对象。仍以上述为例
str转换为unicode
u2 = s1.decode()type(u2)
返回
<type 'unicode'>
unicode转换为str
s2 = u1.encode()type(s2)
返回
<type 'str'>
注意,这里decode和encode方法没有传入编码参数,表示默认为“ASCII”编码。如果涉及到中文,常用的还有utf-8、gbk编码格式。
一个编码算例
例如,读取一个原始编码为utf-8的html文件,并转换为str对象
import iowith io.open('test.html', 'r') as file:
html = file.read()
print type(html)
html = html.encode('utf-8')
print type(html)
返回
<type 'unicode'><type 'str'>
关于print输出结果
文首算例中,为什么两个完全不同的对象,print出来的结果完全一致?
参照print函数说明文档:
“``print`` evaluates each expression in turn and writes the resultingobject to standard output (see below). If an object is not a string,
it is first converted to a string using the rules for stringconversions.......”
简单地说就是
print 函数默认输出返回值的字符串格式,如果返回的不是字符串,它会将其转换为字符串格式。简单理解:
function print(x):#演示代码仅供理解,实际并非如此return str(x)
所以,print返回的是转换为字符串后的结果,导致输出看起来是一样的,但实际上是完全不同的。
如何识别str对象的编码
chardet一款常用的识别编码的开源库(https://pypi.python.org/pypi/chardet)
安装
pip install chardet
识别
import chardetstr = 'good'chardet.detect(str)
我的微信公众号
分享科研软件、科研方法,为你的科研助力。
评论