2017-02-26 16 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'は' str'ではないでしょう。あなたの正規表現でスラッシュをエスケープする必要はありません。 –

+2

正規表現でjsonを解析しないでください。代わりに 'json'モジュールを使用してください。 – thebjorn

+0

@ Jean-FrançoisFabre 'data'はdictであり、data = json.load(dell.json)から取得します。エスケープスラッシュを削除しようとしましたが、それでも動作していません。 –

答えて

0

問題が見つからない場合はデフォルトの値はいくつかの点で返され、reモジュールがそれにチョークされNone、ということです。

見つからない場合は、デフォルト値として""を返す必要があります。

もう1つの問題は、一部のキーがリストにリンクされている(例:['/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

ありがとう、それはたくさんの意味があります。私はまだ機能に苦労していて、私の機能をちょっとねじれさせることを願っています。 –

関連する問題