2017-02-26 73 views
0

我想根据下面的json文件计算组件的数量。TypeError:期望的字符串或类似字节的对象(Python)

这里是我现在:

# 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

+0

'data'可能是'bytes'而不是'str'。顺便说一句,没有必要在你的正则表达式中跳出斜杠; –

+2

不要使用正则表达式解析json。改用'json'模块。 – thebjorn

+0

@ Jean-FrançoisFabre'data'是一个字典,我从data = json.load(dell.json)获得。我试图删除逃逸斜线,但它仍然无法正常工作。 –

回答

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'] 
+0

谢谢,这很有道理。我仍然在努力争取功能,并希望我可以稍微扭转我的功能。 –

相关问题