前言:

  文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的文件一般是以“ 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. gcc gdb调试 (二)

    GDB的命令概貌——————— 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen> g ...

  2. Linux下的一些名词解释

    libffi (以下E文摘自http://www.sourceware.org/libffi/) A Portable Foreign Function Interface Library. Comp ...

  3. FQ:从入门到放弃(二)

    上次的FQ:从入门到放弃(一)介绍了XXNet的部署和基本使用.本文整理一些部署过程中出现的问题,都是这几天朋友们安装过程中出现的问题.如果覆盖不全,欢迎在博客下方评论,互相交流,互相学习. 不过首先 ...

  4. sklearn.naive_bayes中几种朴素贝叶斯分类器

    区别: 几种朴素贝叶斯分类器的区别在于对于分布的假设,即假设满足的形式. 一.高斯NB 导入 from sklearn.naive_bayes import GaussianNB 假设特征的似然函数满 ...

  5. ASP.NET基于Redis的Provider库

    因为session基于本地cache,以前我们自己写分布式缓存,或者数据库存储,或者cookie加密存储,来保存用户状态信息,但较少的直接通过创建一个继承 SessionStateStoreProvi ...

  6. Lunce编程模型

    问题的场景: 解决方案:都是来自于科技论文 ============================================================================== ...

  7. 给iOS开发新手送点福利,简述UIDatePicker的用法

    1.Locale 设置DatePicker的地区,即设置DatePicker显示的语言. 1.跟踪所有可用的地区,取出想要的地区 NSLog(@"%@", [NSLocale av ...

  8. 解决Visual Studio “无法导入以下密钥文件”的错误

    错误1无法导入以下密钥文件: Common.pfx.该密钥文件可能受密码保护.若要更正此问题,请尝试再次导入证书,或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_ 1110Co ...

  9. tensorboard-sklearn数据-loss

    记录sklearn数据训练时的loss值,用tensorboard可视化 三步骤:红字处 import tensorflow as tf from sklearn.datasets import lo ...

  10. uva-639-枚举

    题意: 象棋里的車可以吃横竖的車,题目加了一个墙,用于阻断攻击,问4x4的棋盘最多可以放多少只車, 思路:枚举每一个点,2^16次方种情况 #include<stdio.h> #inclu ...