TypeError:Python 中预期的字符串或类似字节的对象

TypeError: Python 中预期的字符串或类字节对象

TypeError: expected string or bytes-like object in Python

当您将非字符串参数传递给需要字符串的函数时,会出现 Python“TypeError: expected string or bytes-like object”。

要解决该错误,请确保使用字符串参数调用该函数。

typeerror 预期字符串或字节类对象

下面是错误如何发生的示例。

主程序
import re my_int = 100 # ⛔️ TypeError: expected string or bytes-like object result = re.sub(r'[0-9]', '_', my_int) # 👈️ third arg must be str

我们将一个整数作为第三个参数传递给该re.sub方法,但该方法需要一个字符串参数。

re.sub()方法有 3 个参数:

  1. 要在字符串中匹配的模式。
  2. 匹配项的替换字符串。
  3. 要在其中匹配模式的字符串。

将值转为字符串解决错误

解决该错误的一种方法是使用
str()类将值转换为字符串。

主程序
import re my_int = 100 # ✅ convert to str result = re.sub(r'[0-9]', '_', str(my_int)) print(result) # 👉️ '___'

我们str()在调用时使用类将整数转换为字符串
re.sub()

您可能还会迭代一个序列并调用re.sub()每个项目的方法。

如果您不确定序列中的所有项目是否都是字符串,请将每个项目传递给类str()
主程序
import re my_list = [0, 10, 100] new_list = [] for item in my_list: result = re.sub(r'[0-9]', '_', str(item)) print(result) new_list.append(result) print(new_list) # 👉️ ['_', '__', '___']

我们使用for 循环遍历列表。

str()在每次迭代中,我们在使用之前
将当前项目传递给类
re.sub()

为 None 值提供回退值

如果您的序列存储None值,请提供一个空字符串作为后备。

主程序
import re my_value = None result = re.sub(r'[0-9]', '_', my_value or '') print(result) # 👉️ ''

该表达式的
None or ''计算结果为一个空字符串
,这有助于我们避免错误。

re.sub方法返回一个新字符串该字符串是通过用提供的替换替换模式的出现而获得的。

以下是如何解决使用列表时出现的错误的示例。

主程序
import re from ast import literal_eval my_list = [5, 'a', 0, 'b', 1, 'c', 2, 6] # ✅ remove letters from list my_str = re.sub(r'[a-zA-Z]+', '', str(my_list)) print(my_str) # 👉️ [5, '', 0, '', 1, '', 2, 6] # ✅ remove empty strings from string new_str = my_str.replace("''", '') print(new_str) # 👉️ [5, , 0, , 1, , 2, 6] # ✅ remove double commas from string new_str = new_str.replace(", ,", ',') print(new_str) # 👉️ [5, 0, 1, 2, 6] # ✅ convert string representation of list to list my_list = literal_eval(new_str) print(my_list) # 👉️ [5, 0, 1, 2, 6] print(type(my_list)) # 👉️ <class 'list'>
  1. 我们首先从列表中删除所有字母,将列表转换为字符串。
  2. 然后我们从字符串中删除所有空字符串,并将双逗号替换为单个逗号。
  3. 最后一步是使用该literal_eval()方法将字符串转换为列表。

使用该方法时,您也可能会遇到错误re.findall()

使用时遇到错误re.findall()

以下是使用 时如何发生错误的示例re.findall()

主程序
import re my_int = 100 # ⛔️ TypeError: expected string or bytes-like object, got 'int' result = re.findall(r'[0-9]', my_int)

要解决该错误,请将调用中的第二个参数转换为findall()字符串。

主程序
import re my_int = 100 result = re.findall(r'[0-9]', str(my_int)) print(result) # 👉️ ['1', '0', '0']

在调用之前,我们使用该类str()将值转换为字符串
re.findall()

这是使用该方法时如何发生错误的另一个示例re.findall()

主程序
import re with open('example.txt', 'r', encoding='utf-8') as f: lines = f.readlines() # 👈️ this is a list # ⛔️ TypeError: expected string or bytes-like object m = re.findall(r'\w+th', lines) # 👈️ passing list instead of str

我们将一个列表传递给该re.findall方法,但该方法接受一个字符串参数。

要解决该错误,请调用read()文件对象的方法以获取文件内容的字符串并将该字符串传递给该findall方法。

主程序
import re with open('example.txt', 'r', encoding='utf-8') as f: my_str = f.read() print(type(my_str)) # 👉️ <class 'str'> m = re.findall(r'\w+th', my_str) print(m) # 👉️ ['fourth', 'fifth']

该示例假定您有一个example.txt使用以下内容命名的文件:

例子.txt
first second third fourth fifth

我们所要做的就是确保将字符串作为第二个参数传递给该
re.findall方法。

re.findall方法将一个模式和一个字符串作为参数,并返回一个字符串列表
其中包含字符串中该模式的所有非重叠匹配项。

解决读取JSON文件报错

如果您在尝试读取 JSON 文件时遇到错误,请使用该json.load()
方法。

主程序
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) # ✅ call json.load() with file obj print(my_data) # 👉️ {'name': 'Alice', 'age': 30} print(my_data['name']) # 👉️ 'Alice' print(type(my_data)) # 👉️ <class 'dict'>

上面的代码示例假定您example.json在同一目录中有一个文件。

例子.json
{"name": "Alice", "age": 30}

json.load方法用于将文件反序列化为 Python 对象,而
json.loads方法用于将 JSON 字符串反序列化为 Python 对象

json.load()方法需要一个包含实现方法的 JSON 文档的文本文件或二进制文件.read()

If the error persists, use your IDE to check the type of the method’s
parameters.

One of the arguments the method takes must be of type str and you are passing a value of a different type.

# Checking what type a variable stores

If you aren’t sure what type of object a variable stores, use the built-in
type() class.

main.py
my_str = 'hello' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True my_dict = {'name': 'Alice', 'age': 30} print(type(my_dict)) # 👉️ <class 'dict'> print(isinstance(my_dict, dict)) # 👉️ True

The
type
class returns the type of an object.

The isinstance function returns
True if the passed-in object is an instance or a subclass of the passed-in
class.