关于Python的文本文件转换编码问题

 更新时间:2023年04月17日 08:39:48   作者:CrazyDragon_King  
这篇文章主要介绍了关于Python的文本文件转换编码问题,编程过程中,经成会遇到字符编码的问题,需要的朋友可以参考下

前言 

因为编程的原因,经成会遇到字符编码的问题。如开发工具使用的是UTF-8编码(推荐使用),然后需要导入一个从其它地方获取的工程项目,但是这个工程使用了GBK编码方式。这就导致了一个常见的问题 ——乱码。

测试数据

在这里插入图片描述

在这里插入图片描述

注:测试文本采用UTF-8编码,通常汉字是占三个字节。GBK中汉字通常是占2个字节。

编码转换代码

import os

# 对于单个文件进行操作的函数,如果需要对文件夹进行操作,可以使用一个函数包装它,这样不用修改本函数,即达到扩展的目的了。
def transfer_encode(source_path, target_path, source_encode='GBK', target_encode='UTF-8'):
    with open(source_path, mode='r', errors='ignore', encoding=source_encode) as source_file:  # 读取文件时,如果直接忽略报错,则程序正常执行,但是文件已经损坏了。
        with open(target_path, mode='w', encoding=target_encode) as target_file:               # 所以,应该捕获异常,停止程序执行。
            line = source_file.readline()
            while line != '':
                target_file.write(line)
                line = source_file.readline()
    print("Execute End!")


# 这个函数的功能和上面是一样的,区别在于它是以二进制读取的,然后解码、转码再写入的
def transfer_encode2(source_path, target_path, source_encode='GBK', target_encode='UTF-8'):
    with open(source_path, mode='rb') as source_file:
        with open(target_path, mode="wb") as target_file:
            bs = source_file.read(1024)
            while len(bs) != 0:
                target_file.write(bs.decode(source_encode).encode(target_encode))
                bs = source_file.read(1024)
    print("Execute End!")



source_path = r'C:\Users\Alfred\Desktop\test_data\test\data.txt'
target_path = r'C:\Users\Alfred\Desktop\test_data\test\data1.txt'

transfer_encode(source_path=source_path, target_path=target_path, source_encode="UTF-8", target_encode="GBK")

# transfer_encode2(source_path=source_path, target_path=target_path)

# 在cmd中使用 type命令,可以查看文件的内容,并且使用cmd默认的编码。
# 使用 chcp 命令可以查看当前使用的编码的数字编号

执行结果

控制台输出 这个函数执行的输出没有什么意义,只是我要知道它执行了没,所以打印的。

在这里插入图片描述

测试文件夹 data1.txt是转换编码后的文本。

在这里插入图片描述

在这里插入图片描述

从生成的文件来看,因为只含有一个字,所以只比较大小就知道是否转换成功了。当然了,直接打开查看也是可以的,但是直接打开查看的话,没有什么效果,都会显示一个汉字。所以,这里我们另辟蹊径,使用不一样的查看方式!

在这里插入图片描述

注意:data.txt是采用的UTF-8编码的,而data1.txt是采用的GBK编码的。因为国内使用的Windows默认采用的中国的编码方式,所以它显示不了UTF-8编码的文本。第三个输出是查看当前使用的编码,它返回的是编码的代号,详见下图:

在这里插入图片描述

注:GBK是兼容GB2312的编码。

说明

使用python的话,对于单个文件进行编码转换,只需要7行代码就够了!上面我写了两个函数,但是功能是一样的,区别在于第一个函数是以特定的编码方式读取文本信息,然后直接以另一种编码方式写入。第二个函数是以二进制形式读取文件内容,然后解码再转码写入。它的原理都是一样的,即必须包括依次解码和转码操作。

编码、解码、字符集本身是很复杂的,往深入了讲我也不会了。这里可以这样简化理解,两个不同编码的字符集具有相同的字符,所以将UTF-8编码文件读取出来,是为了得到它映射的字符,然后再写入,是为了将它映射为另一种编码字符集,所以说字符类似于中转站的功能。 而直接使用一种字符集去读取另一种字符集的内容,就会出现上面cmd中显示的乱码。

在这里插入图片描述

PS: 所以,也可以解释一个问题,即为什么打开一个大的文本文件,会导致程序卡死!因为一个大的文本文件,里面包含了很多需要解码的字符。这就和排队有点类似,每一个字符等待被解码,虽然处理一个字符很快,但是一个大的文本文件,包含了大量的字符。例如,notepad++打开大文本毫无压力, 我打开这个超大型的文本,还是直接把它卡死了!(这里的排队只是一个比喻,实际的情况我也不太清楚,但是它一定是需要挨个处理的。)

在这里插入图片描述

我们对其进行估计,假设所有字符都是中文(实际的话,还是包含一些英文的,当总的来说还是中文占多数。)这里显示是大约5千万的字符需要解码,所以计算机处理起来仍然是很吃力的,notepad++可以查看摘要,但是直接打开就卡死了,这里就不进行尝试了。

在这里插入图片描述

 到此这篇关于关于Python的文本文件转换编码问题的文章就介绍到这了,更多相关Python的文本文件转换编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python字典改变value值方法总结

    python字典改变value值方法总结

    在本文里小编给大家分享了关于python字典如何改变value值的相关知识点以及实例代码,需要的朋友们学习下。
    2019-06-06
  • 详解Python中的文件操作

    详解Python中的文件操作

    今天这篇文章给大家介绍Python中的文件操作,文章内容介绍的很详细,有需要的可以参考借鉴。
    2016-08-08
  • Python中字符串的基本使用详解

    Python中字符串的基本使用详解

    Python要求字符串必须使用引号括起来,使用单引号也行,使用双引号也行,只要两边的引号能配对即可,这篇文章主要给大家介绍了关于Python中字符串的基本使用,需要的朋友可以参考下
    2021-12-12
  • python删除某个字符

    python删除某个字符

    这篇文章主要介绍了python删除某个字符,现在发布的是一个比较简单易行的方法,就是遇到该字符便跳过去,不对其进行操作,完美呈现出删除该字符的功能,需要的朋友可以参考下
    2018-03-03
  • fastapi与django异步的并发对比分析

    fastapi与django异步的并发对比分析

    这篇文章主要介绍了fastapi与django异步的并发对比分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • pandas进阶教程之Dataframe的apply方法

    pandas进阶教程之Dataframe的apply方法

    DataFrame中的apply方法就是将函数应用到由列或行形成的一维数组上,下面这篇文章主要给大家介绍了关于pandas进阶教程之Dataframe的apply方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 如何基于OpenCV&Python实现霍夫变换圆形检测

    如何基于OpenCV&Python实现霍夫变换圆形检测

    最近开始学习opencv,想检测图片上的圆环,发现霍夫变换可以做这样的效果出来,于是尝试用霍夫变换做了下圆环检测,这篇文章主要给大家介绍了基于OpenCV&Python实现霍夫变换圆形检测的相关资料,需要的朋友可以参考下
    2021-08-08
  • python实现自动化脚本编写

    python实现自动化脚本编写

    自动化在很多时候是很方便的,本文以修改用户名密码单元为案例,编写测试脚本。完成修改用户名密码模块单元测试,感兴趣的可以了解一下
    2021-06-06
  • python 读取.nii格式图像实例

    python 读取.nii格式图像实例

    这篇文章主要介绍了python 读取.nii格式图像实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 一篇文章搞懂Python反斜杠的相关问题

    一篇文章搞懂Python反斜杠的相关问题

    这篇文章主要给大家介绍了如何通过一篇文章搞懂Python反斜杠的相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论