python2的编码问题(因split处理文件深入的)

小甲鱼与客服聊天的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解码

你可能感兴趣的:(Python)