最近老猿在进行文件操作的验证测试,发现对于中文文本文件如果使用二进制方式打开,返回的类型是bytes,如果要转换成可读的字符串信息需要进行解码。可是老猿使用decode()或decode(“UTF-8”)解码后报错:

Traceback (most recent call last):

File “<pyshell#24>”, line 3, in

print(“line.decode():”,line.decode())

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb3 in position 0: invalid start byte

在网上查了一下,发现给出的解决方法复杂还不容易理解。老猿认为这就是个字符集编码的问题,但以前老猿没有学习过字符集编码的相关知识,于是在网上查了相关的资料,具体请见老猿转载的几篇文章:

1、《转:使用DOS命令chcp查看windows操作系统的默认编码以及编码和语言的对应关系》

2、转:浅析windows下字符集和文件编码存储/utf8/gbk

3、《转1:Python字符编码详解》

4、《转2:Python字符编码详解》

5、《转:Python常见字符编码及其之间的转换》

通过以上几篇文章的学习,老猿确认了是由于操作系统默认字符集是’GBK’而不是’UTF-8’导致的,因此文件存储后的编码也是GBK,则解码时调用decode(‘GBK’)或decode(‘GB2312’)就可以解决。

案例:

>>> fp = open(r"c:\temp\test.txt","rb")
>>> for line in fp:
print("line:",line)
try:print("line.decode():",line.decode())
except:print("line.decode() error")
try:print("line.decode('UTF-8'):",line.decode())
except:print("line.decode('UTF-8') error")
print("line.decode('gbk'):",line.decode('GBK'))
print("line.decode('gb2312'):",line.decode('GB2312')) line: b'\xb3\xfc\xd6\xdd\xce\xf7\xbd\xa7\r\n'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 滁州西涧 line.decode('gb2312'): 滁州西涧 line: b'[\xcc\xc6] \xce\xa4\xd3\xa6\xce\xef\r\n'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): [唐] 韦应物 line.decode('gb2312'): [唐] 韦应物 line: b'\xb6\xc0\xc1\xaf\xd3\xc4\xb2\xdd\xbd\xa7\xb1\xdf\xc9\xfa\xa3\xac\xc9\xcf\xd3\xd0\xbb\xc6\xf0\xbf\xc9\xee\xca\xf7\xc3\xf9\xa1\xa3\r\n'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 独怜幽草涧边生,上有黄鹂深树鸣。 line.decode('gb2312'): 独怜幽草涧边生,上有黄鹂深树鸣。 line: b'\xb4\xba\xb3\xb1\xb4\xf8\xd3\xea\xcd\xed\xc0\xb4\xbc\xb1\xa3\xac\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1\xa1\xa3'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 春潮带雨晚来急,野渡无人舟自横。
line.decode('gb2312'): 春潮带雨晚来急,野渡无人舟自横。
>>>

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


请大家多多支持,点赞、评论和加关注!谢谢!

关于Python中中文文本文件使用二进制方式读取后的解码UnicodeDecodeError问题的更多相关文章

  1. python中的三种输入方式

    python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...

  2. Python中调用其他程序的方式

    前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程, 可以使用win32 ...

  3. python中函数参数的引用方式

    值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...

  4. CSV文件在Python中的几种处理方式

    Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...

  5. python中两种栈实现方式的性能对比

    在计算机的世界中,同一个问题,使用不同的数据结构和算法实现,所使用的资源有很大差别 为了方便量化python中算法的资源消耗,对性能做测试非常有必要,这里针对stack做了python语言 下的性能分 ...

  6. Python中的进制表示方式及转换方法

    在Python中,非十进制数字的表示方式为: 二进制:前面加0b,如0b1001 八进制:前面加0o,如0o3562 十六进制:前面加0x,如0x2af3 不同进制数字可直接进行数学计算,结果返回十进 ...

  7. 转:python中使用txt文本保存和读取变量

    问题: 在python中需要经常有需要提前生成复杂的计算结果变量的需求减少程序计算运行时间的需求,因此这里把变量存在txt文本文件中. 解决方法: 使用两个函数解决问题,一个函数把变量保存到文本文件中 ...

  8. Python中yaml和json文件的读取和应用

    Python对yaml和json文件的读取: yaml文件读取: 首先创建一个yaml文件test.yaml import yaml   #引入包 f=open(path)  #建立Python的文件 ...

  9. c++ 二进制方式读取文件 读取特殊类型数据

    #include <iostream> #include <fstream> using namespace std; /* 二进制方式进行读写文件,可以读写 各种各样数据类型 ...

随机推荐

  1. 【SpringBoot】04.SpringBoot整合Filter的两种方式

    SpringBoot整合Filter过滤器的两种方式: 1.通过扫描注解完成Filter组件注册 创建一个类,实现Filter接口,实现doFilter()方法 在该类使用注解@WebFilter,设 ...

  2. odbc。INI配置

    [ODBC Data Sources] ST = OSCAR ODBC DRIVER [ST] Driver = /opt/ShenTong/odbc/lib/liboscarodbcw.so Ser ...

  3. 前端动画框架GSAP框架随笔

    gsap是目前非常流行的前端动画框架,可以非常轻松构造出复杂的动画效果,这里仅对我实际使用中的一些例子进行总结 官网 示例 文章种所使用代码的在线示例 基础用法 // 声明一个滚动控制器 let ct ...

  4. OpenCV之图像归一化(normalize)

    什么图像归一化 通俗地讲就是将矩阵的值通过某种方式变到某一个区间内 图像归一化的作用 目前能理解的就是归一化到某个区间便于处理,希望高人可以指点 opencv文档中的介绍 C++: void norm ...

  5. Ceph数据盘怎样实现自动挂载

    前言 在Centos7 下,现在采用了 systemctl来控制服务,这个刚开始用起来可能不太习惯,不过这个服务比之前的服务控制要强大的多,可以做更多的控制,本节将来介绍下关于 Ceph的 osd 磁 ...

  6. Python pip下载过慢解决方案

    pip是一个python的包安装与管理工具,安装python时候可以选择是否安装,如果安装了pip可以使用命令查看版本 C:\Users\Vincente λ pip -V pip 19.2.3 fr ...

  7. 5G时代,URL Rewrite 还吃香吗

    URL Rewrite是网站建设中经常用到的一项技巧,通过 rewrite 我们能够屏蔽服务器运行态的信息,包括服务的程序.参数等等,给用户呈现美化后的URL,同时对搜索引擎更加友好,方便我们网站的推 ...

  8. Redis的一些攻击手法整理

    Redis基础 1 Redis基础 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开 ...

  9. Linux学习 - 02 使用 - Centos8 - 网络配置相关

    『Centos8 网络配置』 题外话:最近太忙,利用仅有的周末空闲时间记录点东西,草率了. 问题1:安装 Centos8.2 minimal 过程中,只是设置了 WiFi的静态IP,没有进行[以太网] ...

  10. Java的比较器Comparable与Comparator

    在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...