如何修复 TypeError:需要类似字节的对象,而不是“str”?


在这篇文章中,我们了解到:

  • 是什么TypeError
  • 背后的原因TypeError
  • 如何修复类型错误:需要类似字节的对象,而不是“str”?
    • 方法 1:通过将类型转换为 Byte 类型对象。
    • 方法二:使用encode()函数。
    • 方法三:使用decode()函数。
    • 方法四:以文本方式打开文件。

问题表述

假设您有下面给出的文件,并且您想要查看某个产品的价格。 img

Samsung Galaxy S21现在,您想使用以下代码检查价格:

with open('file.txt', 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip()
    split_line = tmp.split('-')
    price = (str(split_line[1]).replace(' ', ''))
    if split_line[0] == 'Samsung Galaxy S21 ':
        print("Price = ", split_line[1])

但是当您执行代码时,您会收到以下输出: 输出:

Traceback (most recent call last):
  File "D:/PycharmProjects/pythonProject1/TypeError.py", line 6, in <module>
    split_line = tmp.split('-')
TypeError: a bytes-like object is required, not 'str'

所以,这给我们带来了一个问题——什么是 TypeError?是什么导致我们的程序出现这样的错误?\ 因此,让我们立即了解发生此类错误的原因TypeError以及解决此类错误的方法。

什么是Python 中的类型错误?

TypeError当某个操作应用于不正确类型的对象时,通常会引发A。 例子:

print('Java'+2+'Blog')

输出:

TypeError: can only concatenate str (not "int") to str

在上面,我们尝试使用 + 运算符添加一个字符串对象和一个整数对象。这是不允许的,因此我们遇到了一个TypeError.

可能有多种原因导致TypeError. 其中一些原因是:

  • 尝试在两种类型的对象之间执行不受支持的操作。
  • 尝试呼叫不可呼叫的呼叫者。
  • 尝试迭代非迭代标识符。

现在我们对 有了清晰的认识,让我们找出代码中TypeErrors出现错误的原因。TypeError

如何修复类型错误:需要类似字节的对象,而不是“str”

们将文件打开为:with open('file_sample.txt', 'rb'). 这里rb表示二进制模式\,这意味着从文件中读取的所有数据都以bytes. 因此,当您查看第 6 行时,您会发现我们正在尝试使用字符串拆分字节对象。此操作是不允许的,并且会导致TypeError.

那么,我们如何在我们的程序中修复这个错误呢?🤔让我们深入研究解决问题的方法!

方法一:转成字节对象

split()解决我们问题的最简单方法是通过将函数内的分隔符字符串转换为字节对象来确保对象类型匹配。b您可以通过在函数内的定界符字符串前使用前缀来实现此目的split()。这允许您在函数内对字节对象进行操作split(),从而避免TypeError.

解决方案:

with open('file.txt', 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip()
    split_line = tmp.split(b'-')
    if split_line[0] == b'Samsung Galaxy S21 ':
        print("Price = ", split_line[1])

输出:

Price =  b' Rs.1,05,999.00 ;'

方法二:使用decode()

在我们的代码中,我们试图以二进制模式读取文件,然后创建一个字节列表。在 for 循环中,我们将字符串字节进行比较,这正是代码失败的地方。因此,为了克服这个问题,您可以解码字节,同时使用函数将它们添加到列表中decode()

decode()方法允许您从一种编码方案转换,其中参数字符串被编码为另一种所需的编码方案。

让我们看一下下面的代码,以了解我们如何修复TypeError代码中的 。

ith open('file.txt', 'rb') as f:
    lines = [x.decode('utf8').strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip()
    split_line = tmp.split('-')
    if split_line[0] == 'Samsung Galaxy S21 ':
        print("Price = ", split_line[1])

输出:

Price =   Rs.1,05,999.00 ;

方法三:使用Encode()

encode()Python 中的方法用于对字符串进行编码,使用指定的编码。

split()因此,您可以在函数中对分隔符字符串进行编码.encode(),然后继续执行程序中的后续步骤,如下所示。

with open('file.txt', 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip()
    split_line = tmp.split('-'.encode())
    if 'Samsung Galaxy S21 ' in str(split_line[0]):
        print("Price = ", split_line[1])

输出:

Price =  b' Rs.1,05,999.00 ;'

方法四:以文本模式打开文件

另一个解决我们问题的方法是以文本模式打开文件。您可以通过在函数内部使用rtinstead of来实现这一点。rb``open()

解决方案:

with open('file.txt', 'rt') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip()
    split_line = tmp.split('-')
    if 'Samsung Galaxy S21 ' in str(split_line[0]):
        print("Price = ", split_line[1])

输出:

Price =   Rs.1,05,999.00 ;


原文链接:codingdict.net