• Python学习:如何实现文件编码的检测


    文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的文件一般是以“ utf-8 ”或“ GBK ”编码进行保存的,由于编辑器一般设置了默认的保存和打开方式,所以我们在记事本或常见文档编辑器如Word中不容易看到乱码的情况发生,但是,当我们要在内存里读取打开一个文件时,如果文档编码方式和计算机内存默认读取文件的编码不同,或者我们打开文件时未设置正确的编码打开规则,则很有可能出现一堆乱码,无法正常读取文件内容,影响接下来的工作。

    其实,这些情况早就有大佬想到了,所以开发了一个类似机器学习的第三方Python包 ,名为“ chardet ”,通过分析文件的内容,来推断文档的编码格式,然后返回一个报告,提示我们检测的文档最有可能的编码格式和语言。今天我们一起来学习一下,这个很有意思的小技巧。

    一、文件打开模式

    这里介绍一下待会涉及到的文件打开方式,一个是 “ r ” ,即只读模式,只对文档进行读取,不作修改;另一种是 “ rb ” ,即二进制模式,读取的文档以二进制字符串表示(一般文档、图片和视音频等文件为了便于储存、传输的需要,在硬盘上以二进制字符串的形式存在),更直观的说,就是把文件原封不动的从硬盘里读出来,不进行解码,难以阅读。

    二、文件打开方法

    文件打开一般会遇到以下两种情况

    1、已知文件保存的编码格式,则读取时,指定对应的编码格式即可正常读取。

    首先我们先新建一个文档,命名为 “ word1.txt ”,以“ utf-8 ”编码格式保存,内容如下:

    你好,明天!
    
    • 1

    文件打开一般方法如下:

    f = open(file="filename",mode="r",encoding="utf-8")   #文件名最好带后缀,编码格式按已知的文件编码填,此处以 utf-8 为例
    
    • 1

    实例如下:已知一个文件是以 utf-8 编码的,则打开时的编码也是 utf-8。

    f1 = open(file="word1.txt",mode='r',encoding="utf-8") # 打开文件
    data = f1.read() # 读取文件
    print(data) # 输出 : 你好,明天!
    f1.close() # 关闭文件
    
    • 1
    • 2
    • 3
    • 4

    2、文件保存时的编码格式未知,打开时无法设置编码方式,使得读取乱码。

    此时的解决方法有两种:

    (1)一种是不去理会文件的编码格式,只交给计算机读取,保存和传输(不用给人看),以二进制模式打开,即 mode设为 “ rb ”即可,方法如下:

    f2= open(file="word1.txt",mode='rb') # 二进制读取,不指定编码格式,否则可能报错
    data = f2.read() # 读取内容
    print(data)  # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe6\x98\x8e\xe5\xa4\xa9\xef\xbc\x81'
    f2.close()  # 关闭文件
    
    • 1
    • 2
    • 3
    • 4

    (2)另一种则是今天的主角,通过Python第三方包(chardet)帮助我们检测文件的编码格式,然后再按正常模式读取文件,方法如下:

    首先确保已经安装 “chardet”包,若没有安装,安装方法如下(已配置Python环境的情况下,在命令行cmd中输入以下内容):

    pip3 install chardet  # Python2里换成pip
    
    • 1

    注意,由于在测试时发现,文件内容过少时,检测结果有较大偏差(word1.txt识别为“ IBM855 ”),所以这里我重新新建一个测试文件 “word2.txt”,保存时的编码格式为“ utf-8 ”(假设此文件编码格式未知),文件内容如下:

    你好,明天!
    
    现在,您已经可以向标准输入和输出进行读写。现在,来看看怎么读写实际的数据文件。
    
    Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。
    
    open 函数
    你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试代码如下:

    '''
    学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    import chardet
    
    f3 = open(file="word2.txt",mode='rb') # 以二进制模式读取文件
    data = f3.read() # 获取文件内容
    print(data) 
    f3.close() # 关闭文件
    
    result = chardet.detect(data) # 检测文件内容
    print(result) # {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    检测结果详解:

    'encoding': 'utf-8'     表示检测到文件的编码格式为 “ utf-8'confidence': 0.99       表示可信度为百分之九十九
    
    'language': ''          表示文件内容的语言,如 “Chinese”、“English”等,经过测试发现,这个参数并不是所有文件都能被检测出来
    
    • 1
    • 2
    • 3
    • 4
    • 5

    此时,我们就可以按照检测得到的结果,按照已知文件编码格式的情况,查看文件内容即可。

  • 相关阅读:
    CSS3 新特性
    学习WiFi,怎么入手?
    【数据结构】图遍历--广度优先搜索
    井水,矿泉水等饮用水去除氟离子树脂技术
    ThreadPool线程池
    面试时Dubbo原理记不住?来看看《Dubbo原理浅析——从RPC本质看Dubbo》
    【Java集合框架】22 ——SortedMap 接口
    【Web】浅聊Hessian异常toString姿势学习&复现
    Flink部署——Metric Reporters
    3W字,Docker 从入门到精通
  • 原文地址:https://blog.csdn.net/qdPython/article/details/126766696