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 使 ...
随机推荐
- java项目引用证书文件(微信支付的p12文件)
1. 绝对路径: // windows: public static String PATH1 = "E:\\project27_app_wuyoujie\\apiclient_cert.p ...
- VMware Workstation Pro网络配置(WiFi配置等)
常用技巧 连续按两下ctrl+alt,实现鼠标脱离 VMware Workstation Pro网络配置有几种模式: 桥接模式: 网络上的独立主机 占用路由器新IP资源 通过VMware Networ ...
- 【spring】task 任务调度(定时任务)
1.定时任务的几种实现可以看这里:http://gong1208.iteye.com/blog/1773177 2.需要导入spring的jar包,可以参看之前的[spring]相关文章 3.这里使用 ...
- Python3 模块 -- Fabric自动化模版
安装 pip3 install fabric3 创建软连接 find / -type f -name "fab" /usr/local/python3/bin/fab ln -s ...
- Android--多线程之进程与线程
前言 对于Android程序中,使用多线程的技术是必不可少的,就拿之前最简单的例子来说明,对于Android4.0+的应用而言,访问网络必须另起线程才可以访问.本片博客介绍Android下进程和线程, ...
- 《JavaScript总结》js模块化
模块化开发,可以让代码易于扩展.便于日后维护. ES6中的模块化 我们先了解一下 export(导出) 和 import(导入) 这两个关键字. 新建一个文件a.js 并且导出变量test expor ...
- Chapter 4 Invitations——2
To my dismay, I found myself the center of attention for the rest of that week. 令我沮丧的是, 我发现我自己剩余注意力的 ...
- Google的java工具类Guava
前言 google开发java项目肯定也不想重复造轮子,所以肯定也有工具类,就是它了:Guava 我将举例几个实际的例子,发挥这个工具类好用的功能.更多的方法和功能,还有内部的实现可以直接参考http ...
- python实战学习之numpy学习
numpy基础要点 1.生成数组 np.array([]) 2.变量的类型 numpy.ndarray 3.数据的类型 int8,float64,float32,bool等 4.数据的类型转换 x.a ...
- Hyperledger Fabric链码之一
什么是链码(Chaincode)? 我们知道区块链有3个发展阶段:区块链1.0,区块链2.0,区块链3.0.其中区块链2.0就是各种区块链平台百花齐放的阶段,区块链2.0最大的特点就是智能合约,我们接 ...