TypeError: Python 中预期的字符串或类字节对象
TypeError: expected string or bytes-like object in Python
当您将非字符串参数传递给需要字符串的函数时,会出现 Python“TypeError: expected string or bytes-like object”。
要解决该错误,请确保使用字符串参数调用该函数。
下面是错误如何发生的示例。
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 个参数:
- 要在字符串中匹配的模式。
- 匹配项的替换字符串。
- 要在其中匹配模式的字符串。
将值转为字符串解决错误
解决该错误的一种方法是使用
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'>
- 我们首先从列表中删除所有字母,将列表转换为字符串。
- 然后我们从字符串中删除所有空字符串,并将双逗号替换为单个逗号。
- 最后一步是使用该
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
使用以下内容命名的文件:
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
在同一目录中有一个文件。
{"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.
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.
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.