TypeError:期望的字符串或类字节对象(Python)

时间:2017-02-26 20:33:45

标签: 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', []):
        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文件: dell.json

1 个答案:

答案 0 :(得分:0)

问题是,未找到时的默认值是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']