通过UnicodeDecodeError简单讨论python中的编码问题
Python3 环境下可以运行以下代码实现文本替换:
with open(src0,"r") as f1:
content = f1.read()
t = content.replace(r'XXX',r'YYY')
with open(src0,"w") as f2:
f2.write(t)
但上述代码在Python2环境下运行会产生以下错误:
Exception has occurred: UnicodeDecodeError
'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
该错误产生的原因是:python2 将包含非ASCII的字符串转换为Unicode字符串的过程中没有预先指明原始字符串的编码方式。
ASCII,Unicode和UTF-8的区别
ASCII是一套对于英文字母和阿拉伯数字的字符编码表,总共规定了128个字符,可以将它们表示为00000000到01111111的128种二进制编码。
Unicode 则是一套对应所有符号的编码表。但对于unicode来说,表示不同符号的时候所需要的字节数不一样,这导致了它有多种不同的储存方式。
UTF-8就是当今最为普遍的一种Unicode 实现方式。
编码:字符串(str)转换(通过UTF-8)为二进制串(unicode)的过程;解码反之。
解决方法:
import io
with io.open(src0, "r", encoding="utf-8") as f1:
content = f1.read()
t = content.replace(r'XXX',r'YYY')
with io.open(src0,"w", encoding="utf-8") as f2:
f2.write(t)
或者
import io
with io.open(src0, "r") as f1:
content = f1.read()
t = content.replace(u'XXX',u'YYY')
#u是unicode的编码,r是原始字符,python2中默认编码方式为ASCII,python3默认unicode
with io.open(src0,"w") as f2:
f2.write(t)
P.S.
以上的content均为bytes类型需要经过.decode()才能转成str型