前言:

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

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

一、文件打开模式

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

二、文件打开方法

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

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

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

你好,明天!

  文件打开一般方法如下: 

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

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

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

  

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

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

#!-*- coding:utf-8 -*-

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() # 关闭文件

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

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

pip3 install chardet  # Python2里换成pip

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

你好,明天!

现在,您已经可以向标准输入和输出进行读写。现在,来看看怎么读写实际的数据文件。

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。

open 函数
你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。

  测试代码如下:

#!-*- coding:utf-8 -*-
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': ''}

  检测结果详解:

'encoding': 'utf-8'     表示检测到文件的编码格式为 “ utf-8 ”

'confidence': 0.99       表示可信度为百分之九十九

'language': ''          表示文件内容的语言,如 “Chinese”、“English”等,经过测试发现,这个参数并不是所有文件都能被检测出来

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

Python中文件编码的检测的更多相关文章

  1. python中的编码问题:以ascii和unicode为主线

      1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8 ...

  2. 【转】【Python】 python中的编码问题报错 'ascii' codec can't decode 及 URL地址获取中文

    1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8是u ...

  3. python中的编码与解码

      编码与解码 首先,明确一点,计算机中存储的信息都是二进制的   编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显 ...

  4. python 中文件输入输出及os模块对文件系统的操作

    整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作. 文件输入输出 1.内建函数open(file_name,文件打开模式,通用换行符支持),打开文件返回文件对象. 2. ...

  5. python中文件变化监控-watchdog

    在python中文件监控主要有两个库,一个是pyinotify ( https://github.com/seb-m/pyinotify/wiki ),一个是watchdog(http://pytho ...

  6. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

  7. python中的编码和解码

    计算机中常见的编码方式有多种,英文一般是ascii编码,其他有unicode,utf-8,gbk,utf-16等编码. 常见编码方式: ASCII编码:ASCII是早期的编码,包含英文字母.数字和 ...

  8. python 的文件编码处理

    python的文件编码处理有点粗鲁 1.不管文件原来是编码类型,读入后都转换成Unicode的编码 2.写入文件时,write函数把变量以读入文件的编码方式写入(根据open(path,mode,en ...

  9. python中文件的复制

    python中文件的复制 python的os模块有很多文件目录相关的函数,但没有提供直接复制文件的函数,当然可以通过边都边写的方式复制文件.想要直接复制文件可以通过shutil模块 shutil模块是 ...

随机推荐

  1. 启动servlet报错:The servlets named [DemoServlet] and [main.java.com.wlf.demo.servlet.DemoServlet] are both mapped to the url-pattern [/hello] which is not permitted

    先看具体错误日志: [2019-04-26 09:29:25,484] Artifact demo-servlet:war: Artifact is being deployed, please wa ...

  2. 【python】class之super关键字的作用

    在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self):    prin ...

  3. 【FusionCharts学习-3】显示中国地图

    概述 使用FusionCharts显示中国地图 资源获取 地图下载地址:http://www.fusioncharts.com/download/maps/definition/   将下载的地图拷贝 ...

  4. HA 高可用mysql集群

    注意问题: 1.保持mysql用户和组的ID号是一致的: 2.filesystem 共享存储必须要有写入权限: 3.删除资源必须先删除约束,在删除资源: 1.安装数据库,这里使用maridb数据库: ...

  5. SpringMVC 获取请求参数

    1.获取Request response对象 在SpringMVC的注解开发中,可以选择性的接收Request和Response对象来使用 2.获取request对象请求参数 a.通过request对 ...

  6. 1073 Scientific Notation (20 分)

    1073 Scientific Notation (20 分) Scientific notation is the way that scientists easily handle very la ...

  7. 1006 Sign In and Sign Out (25 分)

    1006 Sign In and Sign Out (25 分) At the beginning of every day, the first person who signs in the co ...

  8. win10安装.net framework3.5

    win10默认没有安装.net framework3.5,一般方法需提取Windows安装镜像,麻烦. 离线安装方法如下: cab格式.NET Framework 3.5离线安装包下载地址:百度网盘 ...

  9. css border

    CSS border用于设置HTML元素(如div)的边框,包括边框的宽度.颜色和样式.本文章向码农介绍CSS border边框属性详细内容,感兴趣的码农可以参考一下. CSS 边框即CSS bord ...

  10. 并发基础(七) Thread 类的sleep()、yeild()、join()

    1.Thread.sleep(long millis ) sleep( )是一个静态方法,让当前正在执行的线程休眠(暂停执行),而且在睡眠的过程是不释放资源的,保持着锁. 在睡眠的过程,可以被中断,注 ...