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
,因为 gbk
是
gb2312
的父集,所以这样做不会引起问题。
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')
这样一来我们就可以很方便地在别的地方调用这个函数了。
参考:
Python 将文件从 GBK 编码转为 utf8 编码
http://fanyfull.github.io/2021/06/05/Python-将文件从-GBK-编码转为-utf8-编码/