Python 将文件从 GBK 编码转为 utf8 编码

前言

今天找到一本 txt 格式的书,想用 VSCode 打开看一下,结果已打开发现是乱码,究其原因,是 GBK 编码的锅,所以我需要将其转换为 utf-8 编码。所以就使用 Python 将其转换了一下,这里记录一下过程。

代码

初始版

import chardet

# des.txt 是待转换的文件
with open('des.txt', 'rb') as f:
    data = f.read()
res = chardet.detect(data) # 探测数据的信息,比如编码信息
# 打开 res.txt 文件,如果没有,程序会自动新建(res.txt 是转换之后的文件)
with open('res.txt', 'w', encoding='utf-8') as file:
    line = str(data, encoding=res['encoding'])
    file.write(line)

这里有一个问题,运行这个程序之后会出现如下错误

UnicodeDecodeError: 'gb2312' codec can't decode byte 0xd0 in position 2848: illegal multibyte sequence

改进版

上面的问题是由部分字符的编码问题引起的,所以我们手动把 gb2312 改为 gbk,因为 gbkgb2312 的父集,所以这样做不会引起问题。

import chardet

# des.txt 是待转换的文件
with open('des.txt', 'rb') as f:
    data = f.read()
res = chardet.detect(data) # 探测数据的信息,比如编码信息
if res['encoding'] == 'GB2312':
    res['encoding'] = 'GBK' # 手动改编码
# 打开 res.txt 文件,如果没有,程序会自动新建(res.txt 是转换之后的文件)
with open('res.txt', 'w', encoding='utf-8') as file:
    line = str(data, encoding=res['encoding'])
    file.write(line)

这样一来就能够成功转换了。

注:des.txt 和 res.txt 都是在当前程序所在的文件夹。

封装成函数的版本

import chardet

def transform(des_file, res_file):
    '''
    将文件编码从 GBK 转换成 utf8
    :param des_file: 待转换的编码为 GBK 的源文件
    :param res_file: 转换之后的 utf8 编码的文件
    :return: 
    '''
    with open(des_file, 'rb') as f:
        data = f.read()
    res = chardet.detect(data)
    if res['encoding'] == 'GB2312':
        res['encoding'] = 'GBK'
    with open(res_file, 'w', encoding='utf-8') as file:
        line = str(data, encoding=res['encoding'])
        file.write(line)
    print(line)

if __name__ == '__main__':
    transform('des.txt', 'res.txt')

这样一来我们就可以很方便地在别的地方调用这个函数了。


参考:

https://blog.csdn.net/coreych/article/details/101270551


Python 将文件从 GBK 编码转为 utf8 编码
http://fanyfull.github.io/2021/06/05/Python-将文件从-GBK-编码转为-utf8-编码/
作者
Fany Full
发布于
2021年6月5日
许可协议