Python:将utf-8格式的文件转换成gbk格式的文件

需求:将utf-8格式的文件转换成gbk格式的文件
实现代码以下:
def ReadFile(filePath,encoding="utf-8"):
    with codecs.open(filePath,"r",encoding) as f:
        return f.read()
 
def WriteFile(filePath,u,encoding="gbk"):
    with codecs.open(filePath,"w",encoding) as f:
        f.write(u)
 
def UTF8_2_GBK(src,dst):
    content = ReadFile(src,encoding="utf-8")
    WriteFile(dst,content,encoding="gbk")
代码讲解:
函数ReadFile的第二个参数指定以utf-8格式的编码方式读取文件,返回的结果content为Unicode
而后,在将Unicode以gbk格式写入文件中。
这样就能实现需求。
可是,若是要转换格式的文件中包含有一些字符并不包含在gbk字符集中的话,就会报错,相似以下:
UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 4813: illegal multibyte sequence
以上的报错信息的意思是:在将Unicode编码成gbk的时候,不能将Unicode u'\xa0'编码成gbk。
这里,咱们须要弄清楚gb23十二、gbk和gb18030三者之间的关系
GB2312:6763个汉字
GBK:21003个汉字
GB18030-2000:27533个汉字
GB18030-2005:70244个汉字
因此,GBK是GB2312的超集,GB18030是GBK的超集。
理清了关系以后,咱们进一步改进下代码:
def UTF8_2_GBK(src,dst):
    content = ReadFile(src,encoding="utf-8")
    WriteFile(dst,content,encoding="gb18030")

运行后,发现没有报错,能够正常运行。python

由于,在GB18030字符集中,能够找到u'\xa0'对应的字符。
 此外,还有另一种实现方案:
须要修改下WriteFile方法
def WriteFile(filePath,u,encoding="gbk"):
    with codecs.open(filePath,"w") as f:
        f.write(u.encode(encoding,errors="ignore"))

这里,咱们将Unicode编码(encode)成gbk格式,可是注意encode函数的第二个参数,咱们赋值"ignore",表示在编码的时候,忽略掉那些没法编码的字符,函数

解码同理。
可是,当咱们执行后,发现能够成功的将utf-8格式的文件修改为了ansi格式。但,另外发现生成的文件中,每一个一行都有一行空行。
这里,能够指定以二进制流的形式写文件,修改后的代码以下:
def WriteFile(filePath,u,encoding="gbk"):
    with codecs.open(filePath,"wb") as f:
        f.write(u.encode(encoding,errors="ignore"))
相关文章:
相关文章
相关标签/搜索