在python读取txt和excel文件时,经常遇到编码格式不一致,导致文件无法写入或读取后进行正确的判断。下面对文件的编码格式进行简单的总结
一、字符编码介绍
1. Iso8859-1
Iso8859-1是单字节编码,和ascii编码类似。最多表示的字符范围是0-255,应用于英文系列。
2. BGK
GBK是汉字的国际编码,专门用来表示汉字的,属于双字节编码。其中gbk能同时编码简体汉字和繁体汉字。gbk2312只能编码简体字。
3. Unicode
Unicode是最统一的编码,可以用来编码所有的语言的字符,并且是定长双字节的编码(也有四字节编码)。因此,unicode是不兼容iso8859-1编码,也不兼容任何编码。
但是,定长编码便于计算机处理(但是gbk编码不是定长),因此现在大多数软件内部使用unicode编码。
4. UTF(存储格式)
因为unicode编码不兼容iso8859-1编码,并且定长编码容易造成空间浪费,所以,unicode编码不便于传输以及存储。utf编码是不定长编码,每一个字符的长度从1-6个字节不等(一般来说,英文字母使用一个字节表示,汉字使用三个字节表示),且兼容iso8859-1编码。
注:utf编码能节省空间是相对于unicode而言。但对于汉字的网页,utf编码依然比unicode编码更省空间。因为,汉字网页中充斥着大量的英文字符。对于纯汉字而言,gbk编码比utf编码节省空间
二、Python 2中的问题
1. 如何检测python中字符的编码格式
Python中有一个chardet模块用于检测字符的编码格式。
用法:import chardet
chardet.detct(xxx)
该函数返回一个字典{‘encoding’:xxx,’confidence’:0-1},包括该字符的编码格式,以是该编码的置信度
2. Python 中的编码转化
Unicode将所有的字符都对应上了相应的码点,而utf-8或ascii不过是对应从unicode到字节的映射方式。有映射方式,就有映射方向。把从unicode到字节码(byte string)称为encode,把从字节码(byte string)到unicode码称为decode。
3. encode和decode的用法
先看看decode和encode的语法:
a) decode()方法语法:
str.decode(encoding = “utf-8”,errors = “strict”)
参数:
encoding : 要使用的编码,如“utf-8”
errors: 设置不同的错误处理方案。默认为“strict”,意为编码错误引起一个UnicodeError。“ignore”则会忽略非法字符;
“replace”则会用?取代非法字符;“xlmlcharrefreplace”则使用XML字符引用
b) encode()方法语法
str.encode(encoding = “utf-8”,errors= “strict”
三、读写文件
一般我们使用python中内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。Write()写入时,如果参数是unicode,则需要使用希望写入的编码进行encode()。
如果是其他编码格式的str,则需要先用该str进行decode(),转化成unicode后,再使用写入的编码进行encode。即:将非unicode编码的str,转化为unicode编码格式的str。
如果直接将unicode作为次数传入write方法,首先要使用源代码文件的字符编码进行编码。
四、编码声明
#encoding:utf-8的作用:
py文件是不支持中文的,即使是中文注释也是不行的。utf-8声明是把文件的编码类型改为utf-
参考:http://blog.csdn.net/xw_classmate/article/details/51933904