TypeError:应为字符串或类似字节的对象(Python)

TypeError:应为字符串或类似字节的对象(Python),python,json,regex,Python,Json,Regex,我试图根据下面的json文件计算组件的数量 以下是我目前的情况: # counter for the numbers of components def get_numbers_devices(e, name, locator, counter=0): if re.match(name, e.get(locator, None), re.I|re.M): counter += 1 for child in e.get('children', []):

我试图根据下面的json文件计算组件的数量

以下是我目前的情况:

# counter for the numbers of components
def get_numbers_devices(e, name, locator, counter=0):
    if re.match(name, e.get(locator, None), re.I|re.M):
        counter += 1
    for child in e.get('children', []):
        counter = get_numbers_devices(child, name, locator, counter)
    return counter
例如:

num_memory = get_numbers_devices(data, 'bank:*', 'id')    # memory banks
print(num_memory)  # Output 2
然而,当我尝试使用下面的代码来计算我有多少磁盘时,它给了我TypeError

num_hdd = get_numbers_devices(data, '\/dev\/sda', 'logicalname')  # hdd Qty
print(num_hdd) # TypeError: expected string or bytes-like object
这似乎是我的正则表达式的一个问题,但我有点难以找出是哪个部分导致了这个问题

提前谢谢大家

json文件:
问题在于,未找到时的默认值为
None
,该值会在某个点返回,并且
re
模块会阻塞该值

未找到时,应将
作为默认值返回

另一个问题是,您的一些密钥链接到列表(例如:
['/dev/sda1','/media/ict/KINGSTON']
),因此它也不起作用

因此,我无法为您提供一个运行示例,但提供了一些代码来检查数据类型,以便在找到非字符串时获得正确的错误消息:

def get_numbers_devices(e, name, locator, counter=0):
    z = e.get(locator, "")
    if type(z) is not str:
        raise Exception("wrong value for {} key: {}".format(locator,z))
在您的数据上运行,我得到:

Exception: wrong value for logicalname key: ['/dev/sda1', '/media/ict/KINGSTON']

数据
可能是
字节
而不是
str
。顺便说一句,不需要在正则表达式中避开斜杠;不要用正则表达式解析json。改用
json
模块。@Jean-FrançoisFabre
data
是一个dict,我从data=json.load(dell.json)获取。我试图删除转义斜杠,但仍然不起作用。旁白:
counter=get\u numbers\u设备(儿童、姓名、定位器、计数器)
应该是
counter+=get\u numbers\u设备(儿童、姓名、定位器、计数器)
谢谢,这很有意义。我仍然在函数上挣扎,希望我能稍微扭曲一下我的函数。