Python 'xxx' codec can't decode byte xxx常见编码错

简介: Python 'xxx' codec can't decode byte xxx常见编码错

'xxx' codec can't decode byte xxx常见编码错误处理


测试环境

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格式编码

代码行8f = open('d:\\saofu-weixin.log.2016-11-08.log', 'r')

 

运行报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 4055: illegal multibyte sequence

 

代码行8f = 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-8BOM格式编码

代码行8f = 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格式编码

代码行8f = 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

 

代码行8f = 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 -*-

 

代码行8f = 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(非法的起始字符)

 

通过实验,我们可以得出结论:

按日志文件自身的编码打开并读取文件内容时,运行不报错。

 

综上结论

1python对编码转换的处理:从一种编码到另一种编(暂且称为目标编码)的转换,python会先把目标按某种编码解码为Unicode编码,然后再转换为目标编码。

2、利用pythonopen打开文件时,最好显示的指定编码,即按指定编码打开文件,且该指定编码必须和被打开文件自身的编码设置保持一致,否则可能会导致解码出错,直白的说,被打开文件是什么编码,就用什么编码去打开文件进行解码。

3python源代码文件中的注释# -*- 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

 

目录
相关文章
|
2月前
|
Python Windows
Python:执行py命令,提示: Can‘t find a default Python.
Python:执行py命令,提示: Can‘t find a default Python.
|
2月前
|
JSON 安全 数据格式
7-6|python报错TypeError: can't pickle _thread.RLock objects
7-6|python报错TypeError: can't pickle _thread.RLock objects
|
3月前
|
JavaScript 前端开发 Python
成功解决:Can‘t find Python executable “python“, you can set the PYTHON env variable.
这篇文章分享了作者在运行前端Vue项目时遇到的关于Python执行环境的问题和解决方法。问题是由于找不到Python可执行文件导致的编译错误,解决方法包括安装编译环境、卸载并重新安装出现问题的`node-sass`包,并重新执行`npm install`和`npm run dev`。
成功解决:Can‘t find Python executable “python“, you can set the PYTHON env variable.
|
3月前
|
Python
【Python】解决Can‘t find model ‘en‘. It doesn‘t seem to be a shortcut link, a Python package or a valid
在使用以下代码时,报错Can’t find model ‘en’. It doesn’t seem to be a shortcut link, a Python package or a valid path to a data directory.
57 1
|
4月前
|
编解码
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe9 in position 3114: invalid continuation byte
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe9 in position 3114: invalid continuation byte
|
4月前
|
编解码 程序员 开发者
【Python】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa1 in position 0: invalid start by
【Python】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa1 in position 0: invalid start by
3090 0
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
4天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
4天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
6天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####