首先,要清楚一点:在py文件和python动态解释器(命令行)中,输入中文字符串编码是不一样的,动态解释器中默认编码环境是ansi,比较麻烦(也有解决办法),建议在py文件中处理编码问题。
python2.7中的字符串有两种形式:str”…”和 unicode u”\u…”
#coding:utf-8
s = "中文"
# '\xe4\xb8\xad\xe6\x96\x87'
# 一个汉字用3个utf-8字节码表示,因此s的长度是6
unis = u"中文"
# u'\u4e2d\u6587
# 一个汉字用一个unicode表示,因此unis的长度为2
utf8s = unis.encode('utf-8')
# '\xe4\xb8\xad\xe6\x96\x87'
# unicode对象可以编码为utf-8
uni_utf8s = utf8s.decode("utf-8")
# u'\u4e2d\u6587
# 反之,utf-8格式str可以解码为unicode
>>> s = "中文"
>>> s
'\xd6\xd0\xce\xc4' # 和py文件中的utf-8编码不同,可能是解释器将str里的中文字符编码成了ansi,这里有点疑惑
>>> print s
中文 # 窗口打印显示正确
>>> unis = u"中文"
>>> unis
u'\xd6\xd0\xce\xc4' # 这里就有问题了
>>> print unis
ÖÐÎÄ # 出现了乱码……
# coding:UTF-8
# 导入codecs包不容易出错
import codecs
# 若open函数中的文件路径若有中文字符则需要使用unicode字符串,否则解释器会报错
# 下面一个例子是,将一个utf-8编码保存的txt文件打开,修改一部分内容后保存到一个新建的utf-8编码txt文件中
fread = open(u'D:\\Documents\\文献\\老板修改意见.txt','r')
# utf-8 格式的字节码
rows = fread.readlines()
fread.close()
r1 = rows[0]
# txt文件的开头通常有表明编码类型的字节块
# '\xef\xbb\xbf......'前三个字节码表示该txt文件以utf-8编码保存
# 解码后为u'\ufeff......'
# 使用codecs可以直接新建一个使用utf-8编码保存的txt文件
fwrite_codecs = codecs.open(u'D:\\Documents\\文献\\新建utf8.txt','a','utf-8')
for row in rows:
# 解码 unicode 码
unirow = row.decode('utf-8')
# 等价于 wangls = u'王老师'
wangls = u'\u738b\u8001\u5e08'
# 查找是否有'王老师',有则跳过该行
if unirow.find(wangls) > -1:
continue
else:
# codecs 的write可以把unicode直接编码为utf-8后写入
fwrite_codecs.write(unirow + '\r\n')
fwrite_codecs.close()
print 'done'
# 已有txt是utf-8编码的情况:
# 代码文本中的"str"中文默认为 utf-8,因此直接写入即可
# 或者将unicode编码成utf-8再写入,两者是等价的
fwrite = open(u'D:\\Documents\\文献\\2.txt','a')
s1 = "这是一行中文"
s2 = u"这是一行中文".encode('utf-8')
# s1 == s2 True
fwrite.write(s1)
fwrite.close()
总之,关于编码的问题,最好在.py文件中处理,并且一定要清楚txt文件编码类型、文件打开的方式(open和codecs不同,codecs是编码可选的,读取内容的编码是不一样的),一定要做到心中有数,才不会混淆。