Python 中常见的 TypeError 是什么?
翻译:BioIT 爱好者
原文:TypeError: A Bytes-Like object Is Required, not 'str' | Finxter
简介
目标:在本教程中,我们的目标是修复以下的 TypeError: A Bytes-Like object Is Required, not 'str' 异常,并且还讨论了类似的异常及其解决方案。
示例:考虑以下文件 'scores.txt',其中包含一些随机候选者的分数。
https://blog.finxter.com/wp-content/uploads/2021/04/scores.txt
Mike - 80
Boby - 60
Joe - 75
Shaw - 85
Ravi - 65

现在,让我们尝试在一个简单程序的帮助下从文件中获得 Ravi 的分数。
with open("scores.txt","rb") as p:
lines = p.readlines()
for line in lines:
string=line.split('-')
if 'Ravi' in string[0]:
print('Marks obtained by Ravi:',string[1].strip())
输出:
Traceback (most recent call last):
File "main.py", line 4, in <module>
string=line.split('-')
TypeError: a bytes-like object is required, not 'str'
解析:
如您所见,我们遇到了一个 TypeError 异常:TypeError: a bytes-like object is required, not 'str',因为我们试图使用 'str' 类型的分隔符分割一个 'bytes' 对象。
因此,要解决我们的问题,首先让我们了解什么是 TypeError?
Python 中的 TypeError 是什么?
TypeError 是 Python 程序员最常面临的问题之一。
每当您在程序中使用不正确或不受支持的对象类型时,都会引发该错误。
如果尝试调用不可调用的对象或通过非迭代标识符进行迭代,也会引发此错误。例如,如果您尝试使用 "str" 添加 "int" 对象。
示例:
a = 1
b = 2
c = 'Three'
print(a + b + c) # Trying to add 'int' objects with 'str'
输出:
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(a + b + c) # Trying to add 'int' objects with 'str'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
解决:
要解决上述问题,可以为变量 c 提供一个 'int' 对象,也可以将变量 a 和 b 的类型转换为 'str' 类型。
TypeError: A Bytes-Like object Is Required, not 'str' 是什么?

当你尝试在仅支持 'bytes' 对象的操作中使用 'str' 对象时,就会引发 TypeError: A Bytes-Like object Is Required, not 'str' 的异常。
因此,你可以看到在上述从 'scores.txt' 中提取数据的示例时,我们尝试使用 'str' 拆分字节对象,这是不受支持的操作。因此,Python 引发 TypeError。
如何修复 TypeError: A Bytes-Like object Is Required, not 'str'?

有许多解决上述异常的方法。您可以使用选择似乎更适合您的程序的方式。让我们一一介绍。
方案1:将 "rb' 替换为 "rt"
你可以简单地将模式从
"rb"(即只读二进制)更改为
"rt"(即只读文本)。你甚至可以使用
'r' 表示只读模式,这是
open() 的默认模式。
with open("scores.txt", "rt") as p: # using rt instead of rb
lines = p.readlines()
for line in lines:
string = line.split('-')
if 'Ravi' in string[0]:
print('Marks obtained by Ravi:', string[1].strip())
输出:
Marks obtained by Ravi: 65
因此,以文本模式打开文件后,你不再需要处理字节对象并轻松使用字符串。
方案2:添加前缀 "b"
你可以在
split()方法中的分隔符之前简单地添加前缀 "b"。此前缀确保您可以处理字节对象。
with open("scores.txt", "rb") as p: # using prefix b
lines = p.readlines()
for line in lines:
string = line.split(b'-')
if b'Ravi' in string[0]:
print('Marks obtained by Ravi:', string[1].strip())
输出:
Marks obtained by Ravi: b'65'
方案3:使用 decode() 方法
decode() 是一种编码方案转换的 Python 方法,在该方案中,将参数字符串编码为另一种所需的编码方案。默认情况下,当未提供编码参数时,decode() 方法会将编码方案设为 "utf-8"。
因此,您可以使用 decode() 方法将 'bytes' 类型的对象解码或转换为 'str' 类型。
with open("scores.txt", "rb") as p:
lines = [x.decode() for x in p.readlines()] # applying decode()
for line in lines:
string = line.split('-') # no exception raised because line is of 'str' type
if 'Ravi' in string[0]:
print('Marks obtained by Ravi:', string[1].strip())
输出:
Marks obtained by Ravi: 65
方案4:使用 encode() 方法
就像
decode() 方法一样,我们可以使用
encode() 方法来解决相同的问题。
with open("scores.txt", "rb") as p:
lines = p.readlines()
for line in lines:
string = line.split('-'.encode()) # encode converts ‘str’ to ‘bytes’
if 'Ravi'.encode() in string[0]:
print('Marks obtained by Ravi:', string[1].strip())
输出:
Marks obtained by Ravi: b'65'
方案5:使用 bytes() 方法
bytes() 是 Python 中的一种方法,可用于将给定的字符串转换为 'bytes' 类型。你需要提供将要转换的源字符串,并将编码(在这种情况下为 "utf-8")作为方法的参数。
让我们应用
bytes() 方法解决我们的问题。
with open("scores.txt", "rb") as p:
lines = p.readlines()
for line in lines:
string = line.split(bytes('-', 'utf-8')) # converts str to bytes
if bytes('Ravi', 'utf-8') in string[0]:
print('Marks obtained by Ravi:', string[1].strip())
输出:
Marks obtained by Ravi: b'65'
注意:UTF-8 是用于编码 Unicode 字符的字节编码。
方案6:使用 List Comprehension 和 str() 方法
解决我们问题的另一种方法是在 list comprehension 中使用
str() 方法。这使您可以将
bytes 对象转换为
str 类型。
with open("scores.txt", "rb") as p:
lines = [str(x) for x in p.readlines()] # using str() to typecast bytes to str
for line in lines:
my_string = line.split('-')
if 'Ravi' in my_string[0]:
print('Marks obtained by Ravi:', my_string[1].strip(" '"))
输出:
Marks obtained by Ravi: 65
总结
现在让我们回顾一下本教程中讨论的关键点:
Python 中的 TypeError 是什么?
TypeError: A Bytes-Like object Is Required, not 'str' 是什么?
如何修复 TypeError: A Bytes-Like object Is Required, not 'str'?
请订阅并继续关注,以便将来进行更多有趣的讨论。
Happy coding!


如何卸载 python setup.py install 安装的包?





本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
Python 中常见的 TypeError 是什么?的更多相关文章
- Python中常见的异常总结
Python中常见的异常总结 当Python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常. 一.异常错误 a.语法错误 错误一: if ...
- python中常见的报错信息
python中常见的报错信息 在运行程序时常会遇到报错提示,报错的信息会提示是哪个方向错的,从而帮助你定位问题: 搜集了一些python最重要的内建异常类名: AttributeError:属性错误, ...
- Python中常见的报错名称
Python中常见的报错名称 1.SyntaxError 语法错误.看看是否用Python关键字命名变量,有没有使用中文符号,运算符.逻辑运算符等符号是不是使用不规范. 2.IndentationEr ...
- Python中常见字符串去除空格的方法总结
Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...
- python中常见的错误
python中常见的错误 1.IndentationError: unindent does not match any outer indentation leve 众所周知,Python语法要 ...
- Python 中常见错误总结
IndentationError: unexpected indent Python 中强制缩进,, IndentationError: unexpected indent 缩进错误 这类错误非常常见 ...
- Python中常见的数据类型总结
Python提供多种数据类型来存放数据项集合,主要包括序列(列表list和元组tuple),映射(如字典dict),集合(set),下面对这几种一一介绍: 一 序列 1.列表list 列表是一种有序的 ...
- Python中常见的异常处理
异常和错误 part1:程序中难免出现错误,而错误分成两种 1. 语法错误(这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) # 语法错误示范一 if # 语法错误示范二 d ...
- python中常见的内置函数
map #自定义map函数 def map_test(func, list): res = [] for item in list: res.append(func(item)) return res ...
- python中常见错误及try-except 的用法
1.常见的错误 我们在使用python过程中会出现: (1)SyntaxError 句法错误. (2)IndentationError 缩进错误. (3)NameError 变量未定义错误. (4)T ...
随机推荐
- 深入理解 Python 虚拟机:集合(set)的实现原理及源码剖析
深入理解 Python 虚拟机:集合(set)的实现原理及源码剖析 在本篇文章当中主要给大家介绍在 cpython 虚拟机当中的集合 set 的实现原理(哈希表)以及对应的源代码分析. 数据结构介绍 ...
- git初始化流程
1. 添加 SSH key 一台主机仅需要设置一次 1.1 检查主机是否已经有 SSH key 只需要检查~/.ssh下是否存在 id_rsa.pub 或 id_dsa.pub.若已存在,跳转至步骤3 ...
- Tarjan强连通分量(scc)
概念解释 节点强连通:\(v_i\)与\(v_j\)(\(v_i ≠ v_j\))强连通是指从\(vi\)到\(vj\)和从\(vj\)到\(vi\)都存在路径,即两节点互相可达 强连通图:在有向图\ ...
- SpringCloud微服务实战——搭建企业级开发框架(五十二):第三方登录-微信小程序授权登录流程设计和实现
在前面的设计和实现中,我们的微服务开发平台通过JustAuth来实现第三方授权登录,通过集成公共组件,着实减少了很多工作量,大多数的第三方登录直接通过配置就可以实现.而在第三方授权登录中,微信小程 ...
- ArcMap安装OSM路网数据编辑插件ArcGIS Editor for OSM的方法
本文介绍在ArcGIS下属的ArcMap软件中,ArcGIS Editor for OpenStreetMap这一工具集插件的下载与安装的具体方法. ArcGIS Editor for Ope ...
- STM32 HAL库学习 (3) 中断!
中断在单片机开发中有着重中之重的地位. 中断即打断,实至CPU再执行当前程序时,由于系统出现了某种需要处理的紧急情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急 ...
- 图与网络分析—R实现(五)
四 最大流问题 最大流问题(maximum flow problem),一种网络最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果.最大流问题是一类应用极为广泛的问题, ...
- 镜像搬运工 skopeo
镜像搬运工 skopeo 介绍 skopeo 是一个命令行工具,可对容器镜像和容器存储进行操作. 在没有dockerd的环境下,使用 skopeo 操作镜像是非常方便的. 安装 # 安装 skopeo ...
- PySimpleGU之运行多个窗口
这是PySimpleGUI继续简单的地方,但是问题空间刚刚进入了"复杂"领域. 如果您希望在事件循环中运行多个窗口,则有两种方法可以执行此操作. 当第二个窗口可见时,第一个窗口不会 ...
- .NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
前言 前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法.我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类 ...