翻译: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 是什么?相关推荐

  1. python 中常见的面试练习题

    python 中常见的面试题 语言特性 编码规范 数据类型-字符串 数据类型 - 列表 数据类型 - 字典 数据类型 - 综合 操作类题目 高级特性 正则表达式 其他内容 算法和数据结构 爬虫类 网络 ...

  2. Python中常见的关键字

    Python中常见的关键字 什么是关键字 简单的我们可以把关键字看作古代朝廷的官衔,每一个当官的人可能不一样,但每一个官衔都对应着不同的职位,不同的职责. Python内部自带的用于处理业务逻辑的特殊 ...

  3. Python 中常见的配置文件写法

    相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问,为什么要写配置文件呢?在开发过程中,我们常常会用到一些固定参数或者是常量.对于这些较为固定且常用到的部分,往往会将其写到一个固定 ...

  4. 成功解决Python中出现的TypeError: object of type 'zip' has no len()

    成功解决Python中出现的TypeError: object of type 'zip' has no len() 不罗嗦,直接解决问题! 目录 解决问题 解决思路 解决方法 解决问题 TypeEr ...

  5. Python中常见的配置文件写法分享!

    相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问,为什么要写配置文件呢?在开发过程中,我们常常会用到一些固定参数或者是常量.对于这些较为固定且常用到的部分,往往会将其写到一个固定 ...

  6. Python中常见的语法糖

    Python中常见的语法糖 知识点导航: 1. 横线分隔符 2. 交换两个变量的值 3. 判断变量是否在范围内 4. 字符串的乘法 5. 列表相加 6. 列表切片 7. 解压序列赋值给多个变量 8. ...

  7. python中常见的几种错误

    python中常见的几种错误: 1.end前面一定加逗号 2.命令输入错误 3.冒号中英文切换 4.命令缩进错误 5.等于号要双等于,否则一个等于号是赋值 6.命令之间正确搭配

  8. python打开是什么颜色-Python中常见颜色记录

    python中常见绘图的颜色选择 常见颜色 可选的颜色库 颜色名称对应的颜色码 names = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', ...

  9. Python中常见的__init__.py是什么意思?详解Python import的方式和原理

    Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...

最新文章

  1. bootstrap table 表头与内容不对齐问题解决
  2. Java中 volatile 关键字的最全总结,快给自己查缺补漏吧!
  3. sql语句增删改查与子查询
  4. 对“粘连”footer布局的思考和总结
  5. .NET中国峰会议题征集
  6. PHP 通过设置P3P头来实现跨域访问COOKIE
  7. 16复变函数的积分(二)
  8. VC6编译64位程序
  9. 姐们儿,你就忍了吧—咱们一起骂老板(4)
  10. 【Codeforces】School Regional Team Contest, Saratov, 2011
  11. matlab怎样分别求偏相关系数,如何用Matlab计算相关系数和偏相关系数
  12. HCPL3120手册翻译
  13. iOS 页面的卡顿的原因以及如何解决. 如何优化app的启动速度
  14. Python pypinyin库,实现文字转拼音
  15. BOOST电路的节点电压和电流分析
  16. PHP生成PDF-TCPDF
  17. Python图像处理二:图像像素的访问与数据类型
  18. 基于Linux的航班管理系统
  19. CTRL+C复制和CTRL+V粘贴键不能使用的解决办法
  20. 偶数表达方式 matlab,如果用a表示非零自然数,那么偶数可以表示为(   )。 ①a+2   ② 2a   ③a-1   ④2a-1——青夏教育精英家教网——...

热门文章

  1. 某程序员吐槽:女朋友老板给她包了1314元开工红包,正常吗?网友:这是绿包!...
  2. 苦修月余,斩获bigo、腾讯offer,面经奉上!
  3. 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看
  4. 不懂Redis Cluster原理,我被同事diss了!
  5. 史上最全的高可用服务系统线上问题排查工具单(一)
  6. 推荐10个毕业3年,月入5万技术大神的公众号!
  7. 2019了,互联网研发是不是都快要被淘汰了?
  8. Java短连接生成工具-思路
  9. ASP.netcore MVC钉钉H5微应用(一)准备工作
  10. IIS部署详细步骤、包括错误的解决办法、使用localDB