利用Python从文件中读取字符串(解决乱码问题)
2015-09-15 22:02
591 查看
首先声明这篇学习记录是基于python3的。
python3中,py文件中默认的文件编码就是unicode,不用像python2中那样加u,比如u'中文'。
不过在涉及路径时,比如C:\Users\Administrator\Desktop\StudyNote\Python,还是要加r。
eg:r'C:\Users\Administrator\Desktop\StudyNote\Python'。
因为\是转义符,想输出'\'得写成'\\'才可以。加了r就可以让python自动处理字符串,不让'\'进行转义,因此最终的字符串就是C:\Users\Administrator\Desktop\StudyNote\Python的意思。
OK,继续讲。
首先要明确一点,你的py文件用什么文件编码不重要,都可以顺利执行。不过要保证一点,保存py文件时的编码必须与编码声明的一样。假设你的py文件开头有以下编码声明:
eg: # -*- coding: utf-8 -*-
那么保存py文件时的编码也要为utf-8。
另外再普及一下保存文件编码时的知识,用notepad++在选择编码模式的时候,有utf-8和utf-8 without BOM,这个BOM实际上是在文件开头加注了三个字符,用以表明本文件的编码方式为utf-8,但这个是不需要的,往往会导致读取文件的时候出错(因为多了三个字符嘛,如果要去掉的话还得[3:]一下,挺麻烦的)。所以我们一般用utf-8 without BOM.
再言归正传。我们在处理文本文件的时候,如果该文件是unicode编码,则不需要做任何的处理操作,直接用'r'参数读取直接可用:
eg:
这样就能完整的输出文件里的字符串。
如果不是unicode编码,就不能直接用了,直接读会出现乱码。只能先以'rb'参数读取二进制文件的方式读取进来,read之后再解码。
eg:
这样才能完整显示,不然会有乱码出现。
问题又来了,往往我们并不知道该文件的编码方式,这该怎么办?
幸好python有个强大的工具chardet
eg:
前面‘confidence’是置信概率,后面是推断出的编码方式。以上的结果,意思为推断这段字符串的编码方式为'utf-8'的概率为99%.
经过我的测试,如果文件里的字符串比较少的话,chardet模块是比较难判断出正确的编码模式的,体现在置信概率比较小,字符串多的话,概率会大。我觉得至少大于90%才可信。
得到编码方式后,就可以用来解码了。
f_read_decode=f_read.decode(f_charInfo['encoding'])
print(f_read_decode)
最后补充一下chardet的安装方法:
pip install chardet
pip的安装方法请自行百度。
python3中,py文件中默认的文件编码就是unicode,不用像python2中那样加u,比如u'中文'。
不过在涉及路径时,比如C:\Users\Administrator\Desktop\StudyNote\Python,还是要加r。
eg:r'C:\Users\Administrator\Desktop\StudyNote\Python'。
因为\是转义符,想输出'\'得写成'\\'才可以。加了r就可以让python自动处理字符串,不让'\'进行转义,因此最终的字符串就是C:\Users\Administrator\Desktop\StudyNote\Python的意思。
OK,继续讲。
首先要明确一点,你的py文件用什么文件编码不重要,都可以顺利执行。不过要保证一点,保存py文件时的编码必须与编码声明的一样。假设你的py文件开头有以下编码声明:
eg: # -*- coding: utf-8 -*-
那么保存py文件时的编码也要为utf-8。
另外再普及一下保存文件编码时的知识,用notepad++在选择编码模式的时候,有utf-8和utf-8 without BOM,这个BOM实际上是在文件开头加注了三个字符,用以表明本文件的编码方式为utf-8,但这个是不需要的,往往会导致读取文件的时候出错(因为多了三个字符嘛,如果要去掉的话还得[3:]一下,挺麻烦的)。所以我们一般用utf-8 without BOM.
再言归正传。我们在处理文本文件的时候,如果该文件是unicode编码,则不需要做任何的处理操作,直接用'r'参数读取直接可用:
eg:
f=open('文件路径','r') f_read=f.read() print(f_read)
这样就能完整的输出文件里的字符串。
如果不是unicode编码,就不能直接用了,直接读会出现乱码。只能先以'rb'参数读取二进制文件的方式读取进来,read之后再解码。
eg:
f=open('文件路径','rb') f_read=f.read() f_read_decode=f_read.decode('该文件的编码方式') print(f_read_decode)
这样才能完整显示,不然会有乱码出现。
问题又来了,往往我们并不知道该文件的编码方式,这该怎么办?
幸好python有个强大的工具chardet
eg:
import chardet f=open('文件路径','rb') f_read=f.read() f_charInfo=chardet.detect(f_read) f_charInfo的输出是这样的的一个字典{'confidence': 0.99, 'encoding': 'utf-8'}
前面‘confidence’是置信概率,后面是推断出的编码方式。以上的结果,意思为推断这段字符串的编码方式为'utf-8'的概率为99%.
经过我的测试,如果文件里的字符串比较少的话,chardet模块是比较难判断出正确的编码模式的,体现在置信概率比较小,字符串多的话,概率会大。我觉得至少大于90%才可信。
得到编码方式后,就可以用来解码了。
f_read_decode=f_read.decode(f_charInfo['encoding'])
print(f_read_decode)
最后补充一下chardet的安装方法:
pip install chardet
pip的安装方法请自行百度。
相关文章推荐
- python 闭包中引用的变量值变更问题
- python keyword模块解析
- Python 学习(1)---基本知识整理
- H-Index II @python
- Eclipse + Python 的安装与配置流程
- python unicode_escape
- python核心编程第5章课后题答案
- python decimal和fractions模块
- python math模块
- python核心编程第4章课后题答案(第二版75页)
- python核心编程第3章课后题答案(第二版55页)
- python核心编程第2章课后题答案(第二版36页)
- python运算优先级
- python部分运算符理解
- python基本概念——标识符
- python基本概念——字符串
- python使用基础(win10)
- python笔记之编程风格大比拼
- Python简明教程---学习笔记
- python笔记之中缀语法和管道实现