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 - 80Boby - 60Joe - 75Shaw - 85Ravi - 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 = 1b = 2c = '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 strfor 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 中常见的 TypeError 是什么?相关推荐
- python 中常见的面试练习题
python 中常见的面试题 语言特性 编码规范 数据类型-字符串 数据类型 - 列表 数据类型 - 字典 数据类型 - 综合 操作类题目 高级特性 正则表达式 其他内容 算法和数据结构 爬虫类 网络 ...
- Python中常见的关键字
Python中常见的关键字 什么是关键字 简单的我们可以把关键字看作古代朝廷的官衔,每一个当官的人可能不一样,但每一个官衔都对应着不同的职位,不同的职责. Python内部自带的用于处理业务逻辑的特殊 ...
- Python 中常见的配置文件写法
相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问,为什么要写配置文件呢?在开发过程中,我们常常会用到一些固定参数或者是常量.对于这些较为固定且常用到的部分,往往会将其写到一个固定 ...
- 成功解决Python中出现的TypeError: object of type 'zip' has no len()
成功解决Python中出现的TypeError: object of type 'zip' has no len() 不罗嗦,直接解决问题! 目录 解决问题 解决思路 解决方法 解决问题 TypeEr ...
- Python中常见的配置文件写法分享!
相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问,为什么要写配置文件呢?在开发过程中,我们常常会用到一些固定参数或者是常量.对于这些较为固定且常用到的部分,往往会将其写到一个固定 ...
- Python中常见的语法糖
Python中常见的语法糖 知识点导航: 1. 横线分隔符 2. 交换两个变量的值 3. 判断变量是否在范围内 4. 字符串的乘法 5. 列表相加 6. 列表切片 7. 解压序列赋值给多个变量 8. ...
- python中常见的几种错误
python中常见的几种错误: 1.end前面一定加逗号 2.命令输入错误 3.冒号中英文切换 4.命令缩进错误 5.等于号要双等于,否则一个等于号是赋值 6.命令之间正确搭配
- python打开是什么颜色-Python中常见颜色记录
python中常见绘图的颜色选择 常见颜色 可选的颜色库 颜色名称对应的颜色码 names = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', ...
- Python中常见的__init__.py是什么意思?详解Python import的方式和原理
Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...
最新文章
- bootstrap table 表头与内容不对齐问题解决
- Java中 volatile 关键字的最全总结,快给自己查缺补漏吧!
- sql语句增删改查与子查询
- 对“粘连”footer布局的思考和总结
- .NET中国峰会议题征集
- PHP 通过设置P3P头来实现跨域访问COOKIE
- 16复变函数的积分(二)
- VC6编译64位程序
- 姐们儿,你就忍了吧—咱们一起骂老板(4)
- 【Codeforces】School Regional Team Contest, Saratov, 2011
- matlab怎样分别求偏相关系数,如何用Matlab计算相关系数和偏相关系数
- HCPL3120手册翻译
- iOS 页面的卡顿的原因以及如何解决. 如何优化app的启动速度
- Python pypinyin库,实现文字转拼音
- BOOST电路的节点电压和电流分析
- PHP生成PDF-TCPDF
- Python图像处理二:图像像素的访问与数据类型
- 基于Linux的航班管理系统
- CTRL+C复制和CTRL+V粘贴键不能使用的解决办法
- 偶数表达方式 matlab,如果用a表示非零自然数,那么偶数可以表示为( )。 ①a+2 ② 2a ③a-1 ④2a-1——青夏教育精英家教网——...
热门文章
- 某程序员吐槽:女朋友老板给她包了1314元开工红包,正常吗?网友:这是绿包!...
- 苦修月余,斩获bigo、腾讯offer,面经奉上!
- 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看
- 不懂Redis Cluster原理,我被同事diss了!
- 史上最全的高可用服务系统线上问题排查工具单(一)
- 推荐10个毕业3年,月入5万技术大神的公众号!
- 2019了,互联网研发是不是都快要被淘汰了?
- Java短连接生成工具-思路
- ASP.netcore MVC钉钉H5微应用(一)准备工作
- IIS部署详细步骤、包括错误的解决办法、使用localDB