小甲鱼与客服聊天的python2.7版本,其中有段if role == ‘小甲鱼’,进不去if,但又没报错,就是编码问题,两者未进行比较所以无法进入if语句
#存储文本函数
def save(boy, girl, count):
file_name_boy = 'boy_' +str(count)+'.txt'
file_name_girl = 'girl' +str(count)+'.txt'
#打开文件通用方式,会自动关闭文件
with open(file_name_boy, 'w') as boy_file:
boy_file.writelines(boy)
with open(file_name_boy, 'w') as girl_file:
girl_file.writelines(girl)
#对文本处理函数
def split_file(file_name):
with open(file_name) as txt:
boy = []
girl = []
count = 1
a = 0
for each_line in txt:
if each_line[0:6] != '======':
#split:会将:前的内容存在role,
(role, line_spoken) = each_line.split(':', 1)
if role.decode('gbk') == u'小甲鱼': #非常重要编码问题,从txt中读取的文件是gbk编码格式,但是我们这里字符串默认的是utf-8格式
boy.append(line_spoken) #为了让两个能够比较,那么就统一变为unicode中间格式,gbk解码就是unicode格式,而中文字符串输入前面
#加u就是unicode格式
if role.decode('gbk') == u'小客服':
girl.append(line_spoken)
else:
save(boy, girl, count)
count+=1
#调用文本处理文本
split_file('record.txt')
编码问题:
在python2中,存在编码问题:
一般有一个中间码为unicode,但是它存储太浪费空间故不用它编码存储,用它作为中间量,方便比较之类的
而utf8和gbk都是Unicode基础上的编码且都是支持中文的(他们不能在被编码),可以通过decode(’文本对应编码’)进行解码,变成Unicode格式
相应的unicode可以通过encode(’希望的编码格式’),变为相应的编码格式,例如utf8和gbk
若py文件前申明编码,则代码里面的未申明的编码都是这个默认编码格式,比如头有utf8申明,那么里面字符串默认就是utf8编码
!!一般在代码里将所有文字,都变为unicode码格式,方便字符串的处理,但是输出时,不要忘记转化为相应的编码
若py文件头前没有编码,则里面的默认为ascii码,ascii码主要是英文和一些符号的对应码,没有中文所以无法显示中文
可以加载chardet查看,某内容对应的编码,从而方便解码
import chardet
str = "xxxxx"
str_type = chardet.detect(str)
code = str_type['encoding']
IO时的编码问题
txt
读取txt文件时,如果txt文件为ANSI码,则读入的为gbk编码,可用gbk解码;
如果txt文件为utf-8编码,则读入的也为utf-8编码;而如果txt为unicode时,我们会发现一个奇怪的现象,
读入的文本编码变成了”utf-16”,所以需要用utf-16解码