2017-02-26 101 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

謝謝,這很有道理。我仍然在努力爭取功能,並希望我可以稍微扭轉我的功能。 –

相關問題