利用Python从文件中读取字符串(解决乱码问题)
首先声明这篇学习记录是基于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:
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从文件中读取字符串,用正则表达式匹配中文字符的问题
2013-07-27 21:01:37| 在Windows下,用Python从.txt文件中读取字符串,并用正则表达式匹配中文,在网上看了方法,用的时候发现中文没有被匹配. ...
- Python从文件中读取数据
一.读取整个文件内容 在读取文件之前,我们先创建一个文本文件resource.txt作为源文件. resource.txt my name is joker, I am 18 years old, H ...
- Python从文件中读取数据(2)
一.读取文件中各行的内容并存储到一个列表中 继续用resource.txt 举例 resource.txt my name is joker, I am 18 years old, How about ...
- Python从文件中读取内容,包含中文和英文
读取文件内容使要和保存文件时的格式一致 以UTF-8格式保存文件,如: 读取: 在.py起始行写入:#-*- coding:utf-8 -*- filename = raw_input(u" ...
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
———————————————————————————————————————————从文件中读写字符串(直接读写/通过NSURL读写) #import <Foundation/Foundati ...
- 利用PushbackReader读取文件中某个字符串之前的内容
package File; import java.io.FileReader; import java.io.IOException; import java.io.PushbackReader; ...
- c++ 读取不了hdf5文件中的字符串
问题描述: 在拿到一个hdf5文件,想用c++去读取文件中的字符串,但是会报错:read failed ps: c++读取hdf5的字符串方法见:https://support.hdfgroup.or ...
- 新手C#s.Split(),s.Substring(,)以及读取txt文件中的字符串的学习2018.08.05
s.split()用于字符串分割,具有多种重载方法,可以通过指定字符或字符串分割原字符串成为字符串数组. //s.Split()用于分割字符串为字符串数组,StringSplitOptions.Rem ...
- 【Python】从文件中读取数据
从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 ...
随机推荐
- vue props 传入对象Object,如果外层更改属性,默认里面是不更新,需要使用 this.$set(this.datese1, 'xsfaDateYear1', '')
vue props 传入对象Object,如果外层更改属性,默认里面是不更新,需要使用 this.$set(this.datese1, 'xsfaDateYear1', '')
- Problem D: 小平查密码
Problem D: 小平查密码 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 194 Solved: 40[Submit][Status][Web ...
- 已知一棵完全二叉树,求其节点的个数 要求:时间复杂度低于O(N),N为这棵树的节点个数
package my_basic.class_4; public class Code_08_CBTNode { // 完全二叉树的节点个数 复杂度低于O(N) public static class ...
- QT5:介绍
一.简介 QT是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI) QT除了可以绘制漂亮的界面(包括控件/布局/交互),还可以多线程/访问数 ...
- 《effective c++》问题总结
04 确定对象被使用前已先被初始化 1.static/heap/stack对象 2.trivial对象 3.模板隐式具现化 implicit template instantiations 4.Sin ...
- ubuntu安装easygui模块
使用pip安装easygui 如果未安装pip,则使用如下命令 sudo apt-get install python-pip 安装完pip后,使用如下命令安装easygui sudo pip ins ...
- SimpleDateFormat优化写法
在一个读取数据库数据导出到excel文件的例子当中,每次处理一个时间信息的时候,就需要创建一个SimpleDateFormat实例对象,然后再丢弃这个对象.大量的对象就这样被创建出来,占用大量的内存和 ...
- Python如何查看变量在内存中的地址
在python中可以用id()函数获取对象的内存地址. 用法: object = 1 + 2 object -- 对象
- poj 1979 走多少个‘ . '问题 dfs算法
题意:给你一个迷宫地图,让你走.问最多可以走多少个“." 思路:dfs 找到起点,然后对起点进行dfs操作. dfs操作时,要把当前的位置标志成"#"表示已经走过,然后进 ...
- c++,友元类和友元函数
都是声明时友元的东西可以访问自己类的私有和保护成员 类的友元 友元是C++提供的一种破坏数据封装和数据隐藏的机制. 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息 ...