python 编码笔记,字符编码和读取文件

# -*- coding:gb2312
CODEC1 = 'gbk'
CODEC2 = 'utf-8'
CODEC3 = 'ansi'
FILE = 'C:/Users/songchen.OF3D/Desktop/chn.txt'

#hello_out = u"Hello world沙发呢\n"
#bytes_out = hello_out.encode(CODEC)
#f = open(FILE, "w")
#f.write(bytes_out)
#f.close()

f = open(FILE, "r")
bytes_in = f.read()
f.close()
try:
    hello_in = bytes_in.decode(CODEC1)
except:
    try:
        hello_in = bytes_in.decode(CODEC2)
    except:
        try:
            hello_in = bytes_in.decode(CODEC3)
        except:
            print "failed"

print hello_in,


几个原则摘抄自“python核心编程”:

处理unicode时,程序中出现字符串时,前面一定要加u

不要用str(), 用unicode()函数代替

不要调用string模块,如果传给他非ASCII字符,会报错

不到必须时,不要再程序里编解码unicode字符。只在要写入文件或数据库或网络时,才调用encode函数;只在需要把数据都回来时,才调用decode函数。



也就是说,程序中处理的字符串最好始终是unicode类型的,在读入的时候,通过decode(type)正确的type来得到对应的unicode

写出的时候,通过encode(type)把对应编码类型字符写入到文件中


那么如何知道读入的文件是什么类型的编码呢,有人说通过第三方库chardet;

我想到一个通过多个try...except...块来判断的方法,常用的类型也就那么几个;

还有一个方法,通过win32com或者其他什么途径,先把文件转存成统一格式,再操作,不过这个方法就要针对具体问题而言了,而且有可能会丢失一些信息吧,比如图片图表或者不同语言。

PS.注意上面代码例子中的最后一行,很有意思     

print hello_in,

在输出的同时不换行,而如果

print hello_in
则会多出一个空行

你可能感兴趣的:(python 编码笔记,字符编码和读取文件)