Python实现把utf-8格式的文件转换成gbk格式的文件
admin
2023-07-31 02:10:04
0

需求:将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\”))

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...