Python 'xxx' codec can't decode byte xxx常见编码错
'xxx' codec can't decode byte xxx常见编码错误处理
by:授客 QQ:1033553122
测试环境
python 3.3.2
win7
问题描述
利用python文件io方法 open打开文件,读取文件时报错,提示类似如下错误:
'xxx' codec can't decode byte xxx in position xxxx
经过好一番摸索,才大致搞懂其中的来弄去脉,暂且不说原因吧,来看下笔者做的几个实验。
源代码文件大致如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def testfn():
str_dic_list = []
f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r') # 代码行8
counter = 0
is_found= 0
for line in f:
……(做一些处理)
testfn()
实践探索
实验1
文件(saofu-weixin.log.2016-11-08.log,以下不再赘述)编码设置:ANSI格式编码
代码行8:f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r')
运行报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 4055: illegal multibyte sequence
代码行8:f = open(''d:\\saofu-weixin.log.2016-11-08.log'', 'r',encoding='utf-8')
运行报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 744: invalid start byte
实验2
文件编码设置:UTF-8 无BOM格式编码
代码行8:f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r')
运行报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position 756: illegal multibyte sequence
代码行8:
f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r',encoding='utf-8')
运行不报错
实验3
文件编码设置:USC-2 Big Endia格式编码、USC-2 Little Endia格式编码
代码行8:f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r',encoding='utf-8')
运行报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 0: invalid start byte
代码行8:f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r')
运行报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe in position 0: illegal multibyte sequence
实验4
文件编码设置:UTF-8格式编码
源代码文件编码设置:
# -*- coding:gbk -*-
或
# -*- coding:gb2312 -*-
或
# -*- coding:utf-8 -*-
代码行8:f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r')
运行报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
代码行:f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r',encoding='utf-8')
运行不报错
原因分析
通过上述错误提示,我们可以得出结论:
1、出错了,错误类型为“UnicodeDecodeError”,大致意思是Unicode解码错误
2、具体原因是: 'xxx' codec can't decode byte xxxx in position xx,大致意思就是解码器codec用‘xxx’编码去解码位于xx位置处的xxxx字节
3、进一步细化错误为:illegal multibyte sequence(非法多字节序列) 或者invalid start byte(非法的起始字符)
通过实验,我们可以得出结论:
按日志文件自身的编码打开并读取文件内容时,运行不报错。
综上结论
1、python对编码转换的处理:从一种编码到另一种编(暂且称为目标编码)的转换,python会先把目标按某种编码解码为Unicode编码,然后再转换为目标编码。
2、利用python的open打开文件时,最好显示的指定编码,即按指定编码打开文件,且该指定编码必须和被打开文件自身的编码设置保持一致,否则可能会导致解码出错,直白的说,被打开文件是什么编码,就用什么编码去打开文件进行解码。
3、python源代码文件中的注释 # -*- coding: encoding -*- 和文件解码无关,仅针对脚本文件中在内容,比如中文字符串。
附:关于源代码编码说明
默认的,python源代码文件编码被视为UTF-8编码。按那种编码方式,世界上大多数语言的字符可以同时用于字符串字面量,标识符和注释 - 尽管标准库只使用ASCII字符作为标识符,任何可移植代码应该遵循的约定。为了更恰当的展示所有这些字符,你的编辑器必须能够识别到源代码文件为UTF-8,且必须使用一种能支持文件中所有字符的字体。
我们也可以为源代码文件指定其它不同的的编码。在“#!”行之后添加如下注释语句:
# -*- coding: encoding -*-
指定编码后,源文件中的所有东西都被视为按指定编码格式编码,而非UTF-8编码。
官方原文:By default, Python source files are treated as encoded in UTF-8. In that encoding, characters of most languages in the world can be used simultaneously in string literals, identifiers and comments — although the standard library only uses ASCII characters for identifiers, a convention that any portable code should follow. To display all these characters properly, your editor must recognize that the file is UTF-8, and it must use a font that supports all the characters in the file
It is also possible to specify a different encoding for source files. In order to do this, put one more special comment line right after the #! line to define the source file encoding:
# -*- coding: encoding -*-
With that declaration, everything in the source file will be treated as having the encoding encoding instead of UTF-8
Python 'xxx' codec can't decode byte xxx常见编码错的更多相关文章
- python :ascii codec can't decode byte 0xe8 in posit
python代码: slide.setAttribute("SlideName", module.slide_name) slide.setAttribute("Sli ...
- python 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
在导入csv文件中,出现如上所示的错误,经过查阅资料,解决方法如下: 方法一: pd.read_csv(file_path, encoding='unicode_escape') 方法二: pd.re ...
- django startproject xxx:报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 13: ordinal not in range(128)
django startproject xxx:报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 13: o ...
- 【Error】Python:UnicodeDecodeError: ‘XXX' codec can't decode bytes in position... 解决方法
错误信息: UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 2-5: illegal multibyte sequence ...
- 'utf-8' codec can't decode byte 0xd5 in position XXX: invalid continuation byte问题
找了一下午,各种资料搜集,愣是没搜出来答案. 结果今天早上,做一个小小的改变,就整出来了... 步骤如下: 1.打开excel,全选数据 2.新建记事本,粘贴,选择脚本,更改字体: 3.新建Excel ...
- Python报错UnicodeDecodeError: ascii codec can t decode byte 0xe0 ...解决方法
用命令(python setup.py install)安装webpy时候总是报错 在网上搜索到的解决方法如下: 1. 这是Python 2 mimetypes的bug 2. 需要将Python2.7 ...
- 处理UnicodeDecodeError: ‘XXX' codec can't decode bytes in position...的问题
错误信息: UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 2-5: illegal multibyte sequence ...
- UnicodeDecodeError: ‘XXX' codec can't decode bytes in position X 的问题
错误信息:UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 2-5: illegal multibyte sequence ...
- 【Python】【解决】UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in range(128)
1.问题描述 今天在升级Ubuntu到14.04,使用命令行启动软件更新器,进行版本升级,结果开始升级就异常退出了,具体打印如下: $update-manager -d 正在检查新版 Ubuntu 使 ...
随机推荐
- Ubantu linux中使用PyCharm之---破解PyCharm,实现永久免费试用
打开 http://idea.lanyus.com/ 这个网址,可以直接复制到浏览器打开 获取注册码 K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibG ...
- 超声波手势识别(STM32四路超声波获取)
超声波手势识别在市场上已经有见实现,但研究其传感器发现并不是市场上随意可见的,如果暂且考虑成本,该如何入门实现简单的手势识别呢.聊天中老师给出一个很好的提议,就是固定四个超声波,分别为上下左右,然后进 ...
- django- Vue.js 操作
安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 安装 vue.js cnpm install -g vue- ...
- .NET Core 获取 HttpContext.Current 以及 AsyncLocal 与 ThreadLocal
在 DotNetCore 当中不再像 MVC5 那样可以通过 HttpContext.Current 来获取到当前请求的上下文. 不过微软提供了一个 IHttpContextAccessor 来让我们 ...
- 短视频 SDK 6大功能技术实现方式详解
第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍 ...
- 【转载】“宇宙最强” IDE,Visual Studio 2019 正式发布
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 今天凌晨Visual Studio 2019已经正式发布,现在已经可以下载了.使用V ...
- Android内存优化之内存缓存
前言: 上面两篇博客已经讲了图片的基本知识和图片的加载方法及优化,所有的这些优化都是为了避免应用出现OOM这个问题.一个好的应用程序不仅要健壮不能出错还要方便用户使用,对于用户来说你的应用不仅要美观还 ...
- JavaEE 要懂的小事:三、图解Session(会话)
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 纸上谈兵: 伸展树 (splay tree)[转]
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每 ...
- 13 Tensorflow机制(翻译)
代码: tensorflow/examples/tutorials/mnist/ 本文的目的是来展示如何使用Tensorflow训练和评估手写数字识别问题.本文的观众是那些对使用Tensorflow进 ...