0

誰かがPythonでこのオブジェクトをループして「value」をどこで引き出すかという例を提供できますapi = 'interesting'arguments.name = 'FileName'

これが私がこれまでに持っているものです。
このオブジェクトにはさらに多くのプロセスと呼び出しがあります....出力は省略されています。

編集:このコードを実行すると、次のエラーが発生することに注意してください:「TypeError:リストインデックスはstrではなく整数でなければなりません」

for k, v in object['behavior']['processes']['calls'].items():
            if v['api'] == "interesting":
                           <loop through arguments next>

物体:

{"behavior": {
    "processes": [
        {
        "parent_id": "312", 
        "process_name": "test.exe", 
        "process_id": "1184", 
        "first_seen": "2013-03-02 17:22:48,359", 
        "calls": [
            {
            "category": "filesystem", 
            "status": "FAILURE", 
            "return": "0xc000003a", 
            "timestamp": "2013-03-02 17:22:48,519", 
            "thread_id": "364", 
            "repeated": 0, 
            "api": "interesting", 
            "arguments": [
                {
                "name": "FileHandle", 
                "value": "0x00000000"
                }, 
                {
                "name": "DesiredAccess", 
                "value": "0x80100080"
                }, 
                {
                "name": "FileName", 
                "value": "c:\\cgvi5r6i\\vgdgfd.72g"
                }, ...
4

3 に答える 3

1

あなたがしていることは大丈夫に思えますが、

  1. あなたのインデックスはオフです(リストがあることを注意深く見てください
  2. チェックが無効のようです (vは文字列なので、v['api']無効です)。

だから、代わりにこれをやってみてください(私はあなたのオブジェクトi

for k, v in i['behavior']['processes'][0]['calls'][0].items():
    if k == 'api' and v == "interesting":
        print k,v

また

for dct in i['behavior']['processes'][0]['calls']:
    if dct['api'] == "interesting":
        print 'api',dct['api']

また

for dct in i['behavior']['processes'][0]['calls']:
    for k,v in dct.items():
        if k == 'api' and  v =="interesting":
            print 'api',dct['api']

または、各リストに複数の部分がある場合、

for proc in i['behavior']['processes']:
    for call in proc['calls']:
        print 'api =>',call['api'] # a if here
        for args in call['arguments']:
            print '   argument.name =>',args['name'] # and another if here should do the trick.

エラーが発生する理由
次のコードを試してみると、何が間違っていたのかがわかります。

print type(i['behavior']['processes'])
print type(i['behavior']['processes'][0])
print type(i['behavior']['processes'][0]['calls'])
print type(i['behavior']['processes'][0]['calls'][0])
于 2013-03-11T03:12:07.953 に答える
1

"processes"キーと"calls"それぞれの値であるリストの要素を繰り返し処理していないため、質問のスターターとして与えたものは機能しません。つまり、もっと似たものが必要になります

for proc in object ['processes']:
    for call in proc ['calls']:
        if call ['api'] == "interesting":
            fname = None
            for arg in call ['arguments']:
                if arg ['name'] == "FileName":
                    fname = arg ['value']

次に、探しているファイル名がfname. あなたのデータがどこから来たのかわからないので、これにはエラーチェックがありません。

于 2013-03-11T03:14:28.523 に答える
0
object['behavior']['processes']['calls']

辞書ではなくリストです。

于 2013-03-11T03:13:28.267 に答える