翻译: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 列表、字典、元组的一些小技巧

2021-03-30

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

2020-05-15

生物信息学 Python 入门之源码安装

2019-09-29

Python 日期和时间函数使用指南

2019-09-21

Python 文件与目录操作方法总结

2019-02-17

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Python 中常见的 TypeError 是什么?的更多相关文章

  1. Python中常见的异常总结

    Python中常见的异常总结 当Python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常. 一.异常错误    a.语法错误     错误一:     if     ...

  2. python中常见的报错信息

    python中常见的报错信息 在运行程序时常会遇到报错提示,报错的信息会提示是哪个方向错的,从而帮助你定位问题: 搜集了一些python最重要的内建异常类名: AttributeError:属性错误, ...

  3. Python中常见的报错名称

    Python中常见的报错名称 1.SyntaxError 语法错误.看看是否用Python关键字命名变量,有没有使用中文符号,运算符.逻辑运算符等符号是不是使用不规范. 2.IndentationEr ...

  4. Python中常见字符串去除空格的方法总结

    Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...

  5. python中常见的错误

    python中常见的错误   1.IndentationError: unindent does not match any outer indentation leve 众所周知,Python语法要 ...

  6. Python 中常见错误总结

    IndentationError: unexpected indent Python 中强制缩进,, IndentationError: unexpected indent 缩进错误 这类错误非常常见 ...

  7. Python中常见的数据类型总结

    Python提供多种数据类型来存放数据项集合,主要包括序列(列表list和元组tuple),映射(如字典dict),集合(set),下面对这几种一一介绍: 一 序列 1.列表list 列表是一种有序的 ...

  8. Python中常见的异常处理

    异常和错误 part1:程序中难免出现错误,而错误分成两种 1. 语法错误(这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) # 语法错误示范一 if # 语法错误示范二 d ...

  9. python中常见的内置函数

    map #自定义map函数 def map_test(func, list): res = [] for item in list: res.append(func(item)) return res ...

  10. python中常见错误及try-except 的用法

    1.常见的错误 我们在使用python过程中会出现: (1)SyntaxError 句法错误. (2)IndentationError 缩进错误. (3)NameError 变量未定义错误. (4)T ...

随机推荐

  1. 安装原版Windows自动安装已经备份的驱动

    安装完Windows10后联网会自动更新驱动,除了自动更新.如果不让新安装的Windows系统自动安装驱动以外,还有自己手动安装驱动的方式.如何在安装系统过程中就让系统自己安装好驱动? 重装系统首先要 ...

  2. FlinkSQL自定义函数开发

    本次需求场景主要为实现将flinksql中collect()函数输出的Mutiset(VARCHAR<100>)多行结果转换为字符串. 一.FlinkSQL自定义函数分类 Flink SQ ...

  3. 云上大数据存储:探究 JuiceFS 与 HDFS 的异同

    HDFS 作为 Hadoop 提供存储组件,已经成为大数据生态里面数据存储最常用的选择,通常在机房环境部署. JuiceFS 是一个基于对象存储的分布式文件系统,用户可以在云上快速地搭建按需扩容的弹性 ...

  4. day91:luffy:基于vue+drf的路飞学城项目后端部署

    目录 1.安装mysql镜像 2.把本地的数据导入到容器的mysql数据库中 3.安装redis容器 4.把后端项目部署前的处理 5.修改项目的配置文件:prod.py 6.从后端项目中收集静态文件 ...

  5. TS(一)环境搭建与基本类型

    1 TypeScript 环境搭建 1 准备NodeJs环境 2 npm全局安装typeScript npm i -g typescript 3 编写一个ts文件 4 使用tsc命令编译ts文件为js ...

  6. c语言趣味编程(4)抓交通肇事犯

    一.问题描述 一辆卡车违反交通规则,撞人后逃跑.现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征. 甲说:牌照的前两位数字是相同的: 乙说:牌照的后两位数字是相同的,但与前两位不同: 丙是 ...

  7. WPF Button MouseDown事件

    Button的MouseDown事件 WPF的Button控件,鼠标点击时,MouseDown事件没有触发. 经确认,Button的MouseDown被内部处理了.下面是基类ButtonBase的部分 ...

  8. [C++基础入门] 4、 程序流程结构

    文章目录 4 程序流程结构 4.1 选择结构 4.1.1 if语句 4.1.2 三目运算符 4.1.3 switch语句 4.2 循环结构 4.2.1 while循环语句 4.2.2 do...whi ...

  9. 互异关系容斥&集合幂级数小记

    最近碰见了一些互异关系容斥的题目,而这类题目往往要配合集合幂级数的一些技术使用,所以简单记记. 内容很杂,行文很乱,作者水平很低,酌情观看. 互异关系容斥 思想其实很基本,应用范围其实很广. 原论文. ...

  10. pytest常用断言

    如上官网所说,pytest使用python中的assert来比较实际值与预期值,实现断言功能 1 常用的断言方式 assert xxx assert a == b assert a!=b assert ...