相信使用过python的,都会遇到编码问题,尤其是python
我这里主要说的是对中文的操作遇到的一些问题
打开文件
#!/usr/bin/python
#-*-coding:utf-8-*-
#文件
fileName = r"F:\python_pro\文档.txt"
fd = open(fileName.decode('utf8').encode("gbk"),"ab+") #打开正常,生成的文件名正确
#fd = open(fileName.decode('utf8'),"ab+") #打开正常,生成的文件名正确
#fd = open(fileName,"ab+") #fileName生成的文件名为乱码
fd.write(fileName)
fd.close()
由上可见,对于unicode去操作open是正常的,用str生成的文件不正常,是乱码。至于原因,找了好久,说是open最终使用的是系统的编码,对于str没有明确编码,比如操作系统的编码GB2312去解析utf8格式不成功。如果是unicode和gbk的str去,操作系统能解析。
可以查看下你的操作系统的编码:
import locale
print locale.getpreferredencoding()
我电脑输出为:
locale.getpreferredencoding(): cp936
读写操作
#!/usr/bin/python
#-*-coding:utf-8-*-
import codecs
import sys
import chardet
#文件
fileName = r"F:\python_pro\文档.txt"
fd = open(fileName.decode('utf8').encode("gbk"),"ab+")
filename2 = "E:\doc\test配制.conf"
fd2 = codecs.open(filename2.decode('utf8'),"rb") #filename2是gdk编码,如果用utf-8打开会乱码
#fd2 = open(fileName.decode('utf8'),"r") #fileName文件编码为utf-8,如果用gdk打开,读出来的会乱码
str = fd2.read()
if str[:3] == codecs.BOM_UTF8:
print "utf-8"
print chardet.detect(str)
fd.write(str)
# print str
fd2.close()
fd.close()
上面的例子用记事本打开文档.txt是正常的,没有乱码情况
所以:
1.如果读出来直接写到另外一个文件是不会出问题,相当于流的作用,读出是什么不用管
2.如果读出来的数据要做处理,或者输出什么,如果操作的文件格式跟我们coding:定义的不一致,直接使用会出现乱码,需要转换;
所以在对不知道这文件是什么编码的情况下,最好去判断下看能不能知道是什么编码,这样操作起来就方便多了
参考文章 http://www.cnblogs.com/huxi/articles/1897271.html 这文章对编码讲解的还可以