前言:机器学习
文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,咱们常见的文件通常是以“ utf-8 ”或“ GBK ”编码进行保存的,因为编辑器通常设置了默认的保存和打开方式,因此咱们在记事本或常见文档编辑器如Word中不容易看到乱码的状况发生,可是,当咱们要在内存里读取打开一个文件时,若是文档编码方式和计算机内存默认读取文件的编码不一样,或者咱们打开文件时未设置正确的编码打开规则,则颇有可能出现一堆乱码,没法正常读取文件内容,影响接下来的工做。编辑器
其实,这些状况早就有大佬想到了,因此开发了一个相似机器学习的第三方Python包 ,名为“ chardet ”,经过分析文件的内容,来推断文档的编码格式,而后返回一个报告,提示咱们检测的文档最有可能的编码格式和语言。今天咱们一块儿来学习一下,这个颇有意思的小技巧。ide
1、文件打开模式函数
这里介绍一下待会涉及到的文件打开方式,一个是 “ r ” ,即只读模式,只对文档进行读取,不做修改;另外一种是 “ rb ” ,即二进制模式,读取的文档以二进制字符串表示(通常文档、图片和视音频等文件为了便于储存、传输的须要,在硬盘上以二进制字符串的形式存在),更直观的说,就是把文件原封不动的从硬盘里读出来,不进行解码,难以阅读。学习
2、文件打开方法测试
文件打开通常会遇到如下两种状况编码
一、已知文件保存的编码格式,则读取时,指定对应的编码格式便可正常读取。spa
首先咱们先新建一个文档,命名为 “ word1.txt ”,以“ utf-8 ”编码格式保存,内容以下: 命令行
你好,明天!
文件打开通常方法以下: code
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() # 关闭文件
二、文件保存时的编码格式未知,打开时没法设置编码方式,使得读取乱码。此时的解决方法有两种:
(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”等,通过测试发现,这个参数并非全部文件都能被检测出来
此时,咱们就能够按照检测获得的结果,按照已知文件编码格式的状况,查看文件内容便可。