关于数据处理使用python时出现的各种编码问题的解决方案

关于python中出现的各种编码问题
  • 首先,windows下复制文件的绝对路径时请绝对不要使用属性->安全中的直接复制,因为这样做有时候会引入额外的不可见字符。请按下shift键的同时点击右键,会有一项是“复制为路径”,点击这个项就可以得到一个带双引号的绝对文件路径
  • 另外,简介一下.encode()和.decode()两个函数的用法。python内部运行时使用的都是unicode,但是问题是有时候有的文件名或某些文件的内容是使用其他方式编码的,所以要用这两个函数来把它们变成unicode。一个非unicode的内容要变成unicode,需要解码(decode)为unicode,而unicode格式的内容要输出时需要编码(encode)为其他的编码格式。
  • 另外,注意每一个python文件第一行都要写上`#-*-coding:utf-8-*-`,表示这个py‘文件的编码格式是utf8。这里的编码格式的意思是作为文件,它存贮的时候使用的编码格式。
  • 字符串前面直接加u表示用unicode储存,而加r表示
  • python的默认编码是ascii码,而如果要想把默认编码方式变为utf8,可以用下述的方法:
可以在Python安装目录下的Lib/site-packages目录中,新建一个sitecustomize.py文件(也可以建在其它地方,然后手工导入,建在这里,每次启动Python的时候设置自动生效),内容如下:
import sys
sys.setdefaultencoding('utf-8') #set default encoding to utf-8
想要看到效果(是否已经生效):
import syssys.getdefaultencoding()
  • open(filename, 'w')这个方法中,filename这个参数必须是Unicode编码的参数
  • u’字符串’ 代表是unicode格式的数据,路径最好写成这个格式,别直接跟字符串’字符串’这类数据相加,相加之后type就是str,这样就会存在解码失误的问题。
  • 有些读取的方式偏偏是要读取str类型的路径,不是unicode类型的路径,那么我们把这个str.encode(‘utf-8’)就可以了,保存到txt中也这样处理,因为保存到txt中,中文也得先转成utf-8格式的字符串。
  • 有个神妙的问题是:你在代码中用中文初始化出来的字符串是utf-8的,但是python自动生成的字符串是unicode的。另外像是数据库这种地方,它的数据格式又不一定,要先验证。
  • 一个变量中放了一个中文字符串,如x="中",那么直接打x回车后控制台输出的是其编码,比如'\xca\xc2',而打print x则会返回“中”
  • 数组或是元组等初始化时候,如果涉及到汉字,一定要在引号前面加u,如:x=[u"在",u"中"] ,因为文件保存时候的编码类型是utf-8,所以要是直接在代码中初始化中文,千万注意要在引号前面加u。
  • Python中的编码问题,Python中的字符串的大概分为为str和Unicode两种形式,其中str常用的编码类型为utf-8,gb2312,gbk等等,Python使用Unicode作为编码的基础类型。str记录的是字节数组,只是某种编码的存储格式,终于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将他解码成什么样子;Unicode是一种类似于符号集的抽象编码,它只规定了符号的二进制代码,却没有规定这个二进制代码该如何存储,也就是它只是一种内部表示,不能直接保存,所以存储时需要规定一种存储形式,比如utf-8等。
  • string-escape和unicode-escape:
  1. string-escape是对二进制的字节流,一个字节一个字节转义,并对每个字节以16进制输出;unicode-escape是对unicode编码的字节流,两个字节两个字节转义,并对每两个字节一起以16进制输出。
  2. unicode <-> utf8/gbk <-> string-escape;unicode <-> unicode-escape
关于数据处理使用python时出现的各种编码问题的解决方案
  • 从下图可见,python中存贮的是没有转义的纯字符,即\\,而print之后就已经转义过了。只有一个\
关于数据处理使用python时出现的各种编码问题的解决方案

Python读取中文路径时的处理
关于数据处理使用python时出现的各种编码问题的解决方案

把程序中的unicode形式的内容写到txt中的方式
举例如下:
writeToPos = unicode(r"D:\_Desktop_temp\机器学习\需求分析\所有问题种类.txt")
writeTo = open(writeToPos,"w+")
setTable = list(set(table.col_values(ord('C')-ord('A'))))
strSetTable = str(setTable).replace('u\'','\'')
strSetTable = strSetTable.replace(',','\n')
writeTo.write(strSetTable.decode('unicode-escape'))
  • 总结:先用unicode(r"file_path")或是ur"file_path"获取unicode格式的正确文件地址,再用open()打开,最后使用write或是writeline函数写入文件,记住如果要写入的内容是一个单纯的unicode字符串,则可以直接在输出的时候encode成utf-8就好啦,但是如果是一个list或是一个set等,这时候由于像是u'/\u552e\u53d1\u8ba2\u5355#\u673a\u5668\u4eba'这样的格式的内容有许多,并且用","隔开,所以我们要使用如下方式:
  1. 将原list/set转换为字符串(用str()函数)
  2. 将1中的结果用.replace('u\'','\'')的方式把u单引号换成单引号,即删掉单引号前面的u
  3. 输出的时候使用2中的结果.decode('unicode-escape')

list、set等的转码处理
  • 由于list、set等无法直接encode和decode,所以可以用以下的方法解决:
setTable = list(set(table.col_values(ord('C')-ord('A'))))
strSetTable = str(setTable).replace('u\'','\'')
strSetTable = strSetTable.replace(',','\n')