• 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。
    这里,我们需要弄清楚gb2312、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")

    运行后,发现没有报错,可以正常运行。

    因为,在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"))
    相关文章:
  • 相关阅读:
    将vs2010换成vs2012的主题
    写了个油猴脚本
    Myeclipse10下的access数据库配置
    点击按钮触发声音(xaml实现)
    自定义的可拖动窗体
    在博客添加时钟
    定时器写的闪光字
    C语言I博客作业02
    c语言|博客作业02
    关于软件工程的一些疑问
  • 原文地址:https://www.cnblogs.com/hongfei/p/4240112.html
Copyright © 2020-2023  润新知