2

すべての情報を抽出して変数として保存するために、json ファイルをダウンロードしてファイルを保存し、json ファイルを反復処理しようとしています。次に、メッセージを csv 形式でフォーマットして、データを別のシステムに送信します。私の問題はjsonデータです。リスト内の辞書のように見えますが、処理方法がわかりません。

これがjsonです:

[ {
  "ipAddress" : "",
  "feedDescription" : "Botted Node Feed",
  "bnFeedVersion" : "1.1.4",
  "generatedTs" : "2013-08-01 12:00:10.360+0000",
  "count" : 642903,
  "firstDiscoveredTs" : "2013-07-21 19:07:20.627+0000",
  "lastDiscoveredTs" : "2013-08-01 00:34:41.052+0000",
  "threatType" : "BN",
  "confidence" : 82,
  "discoveryMethod" : "spamtrap",
  "indicator" : true,
  "supportingData" : {
    "behavior" : "spamming",
    "botnetName" : null,
    "spamtrapData" : {
      "uniqueSubjectCount" : 88
    },
    "p2pData" : {
      "connect" : null,
      "port" : null
    }
  }
}, {
  "ipAddress" : "",
  "feedDescription" : "Botted Node Feed",
  "bnFeedVersion" : "1.1.4",
  "generatedTs" : "2013-08-01 12:00:10.360+0000",
  "count" : 28,
  "firstDiscoveredTs" : "2013-07-19 03:19:08.622+0000",
  "lastDiscoveredTs" : "2013-08-01 01:44:04.009+0000",
  "threatType" : "BN",
  "confidence" : 40,
  "discoveryMethod" : "spamtrap",
  "indicator" : true,
  "supportingData" : {
    "behavior" : "spamming",
    "botnetName" : null,
     "spamtrapData" : {
      "uniqueSubjectCount" : 9
    },
    "p2pData" : {
      "connect" : null,
      "port" : null
    }
  }
}, {
  "ipAddress" : "",
  "feedDescription" : "Botted Node Feed",
  "bnFeedVersion" : "1.1.4",
  "generatedTs" : "2013-08-01 12:00:10.360+0000",
  "count" : 160949,
  "firstDiscoveredTs" : "2013-07-16 18:52:33.881+0000",
  "lastDiscoveredTs" : "2013-08-01 03:14:59.452+0000",
  "threatType" : "BN",
  "confidence" : 82,
   "discoveryMethod" : "spamtrap",
  "indicator" : true,
  "supportingData" : {
    "behavior" : "spamming",
    "botnetName" : null,
    "spamtrapData" : {
      "uniqueSubjectCount" : 3
    },
     "p2pData" : {
      "connect" : null,
       "port" : null
    }
  }
 } ]

私のコード:

download = 'https:URL.BNfeed20130801.json'

request = requests.get(download, verify=False)
out  = open(fileName, 'w')
for row in request:
    if row.strip():
         for column in row:
                 out.write(column)
    else:
        continue
out.close()
time.sleep(4)
jsonRequest = request.json()

for item in jsonRequest:
     print jsonRequest[0]['ipAddress']
     print jsonRequest[item]['ipAddress'] --I also tried this

上記を実行すると、同じIPが何度も表示されます。テスト目的でのみ印刷ステートメントを入れました。JSON のさまざまな要素にアクセスする方法がわかったら、それを変数に格納し、それに応じてこれらの変数を使用します。どんな助けでも大歓迎です。

助けてくれてありがとう。LinuxでPython 2.6を使用しています。

4

2 に答える 2

4

基本的に、辞書のリストを繰り返し処理しています。試してみてくださいitem['ipAddress']

于 2013-08-19T19:33:37.690 に答える
2

alecxe's answer はこれを修正する方法を教えてくれますが、元のコードの何が問題なのかを説明してみましょう。


インタラクティブなビジュアライザーを実行できるようになると、より単純な例で理解しやすくなります。

a = ['a', 'b', 'c']

これを行う場合:

for item in a:

item'a'、初めて、次に'b'、次に になり'c'ます。

しかし、これを行うと:

for item in a:
    print a[0]

…あなたは完全に無視していますitem。ループaを通過するたびに、a[0]つまりa.

そして、これを行うと:

for item in a:
    print a[item]

…リストの th 番目のものを要求しているため、例外が発生しますが'a'、これはナンセンスです。

しかし、このコードでは:

for item in a:
    print item

'a'、次に'b'、そしてを印刷'c'します。これはまさにあなたが望むものです。

これを行うこともできます:

for index, item in enumerate(a):
    print a[index]

…しかし、それはばかげています。インデックスが必要な場合は を使用enumerateしますが、アイテム自体が必要な場合は、既に取得しています。


それでは、実際のコードに戻ります。

for item in jsonRequest:
     print jsonRequest[0]['ipAddress']

繰り返しますが、あなたは毎回無視しitemて尋ねています。jsonRequest[0]

そして、このコードでは:

for item in jsonRequest:
    print jsonRequest[item]['ipAddress'] --I also tried this

{complicated dictionary}… の番目のことを求めていますがjsonRequest、これもナンセンスです。

しかし、このコードでは:

for item in jsonRequest:
    print item['ipAddress']

簡単な例のように、各アイテムを使用しています。

于 2013-08-19T20:06:51.320 に答える