1

一部の API JSON データを csv にエクスポートしようとしていますが、その一部だけが必要です。試してみましrow.appendたが、エラーが発生していますTypeError: string indices must be integers

私はPythonが初めてで、整数が必要な理由について少し混乱しています。

import urllib2
import json
import csv

outfile_path='/NYTComments.csv'

writer = csv.writer(open(outfile_path, 'w'))

url = urllib2.Request('http://api.nytimes.com/svc/community/v2/comments/recent?api-key=ea7aac6c5d0723d7f1e06c8035d27305:5:66594855')

parsed_json = json.load(urllib2.urlopen(url))

print parsed_json

for comment in parsed_json['results']:
    row = []
    row.append(str(comment['commentSequence'].encode('utf-8')))
    row.append(str(comment['commentBody'].encode('utf-8')))
    row.append(str(comment['commentTitle'].encode('utf-8')))
    row.append(str(comment['approveDate'].encode('utf-8')))
    writer.writerow(row)

出力された parsed_json は次のようになります。

{u'status': u'OK',
u'results':
    {u'totalCommentsReturned': 25,
    u'comments':
        [{
            u'status': u'approved',
            u'sharing': 0,
            u'approveDate': u'1349378866',
            u'display_name': u'Seymour B Moore',
            u'userTitle': None,
            u'userURL': None,
            u'replies': [],
            u'parentID': None,
            u'articleURL': u'http://fifthdown.blogs.nytimes.com/2012/10/03/thursday-matchup-cardinals-vs-rams/',
            u'location': u'SoCal',
            u'userComments': u'api.nytimes.com/svc/community/v2/comments/user/id/26434659.xml',
            u'commentSequence': 2,
            u'editorsSelection': 0,
            u'times_people': 1,
            u'email_status': u'0',
            u'commentBody': u"I know most people won't think this is a must watch game, but it will go a long way .... (truncated)",
            u'recommendationCount': 0,
            u'commentTitle': u'n/a'
        }]
    }
}
4

2 に答える 2

2

あなたは私がいつも犯している間違いを犯しているようです。それ以外の

for comment in parsed_json['results']:

あなたが欲しい

for comment_name, comment in parsed_json['results'].iteritems():

(または.items()Python 3を使用している場合)。

辞書を繰り返すだけで(parsed_json['results']おそらくそうですが)、要素ではなく辞書のキーが得られます。もし、するなら

for thing in {'a': 1, 'b': 2}:

次にthing、「a」と「b」をループします。

次に、そのキーは明らかに文字列であるため、のようなことを行おうとしています。"some_name"['commentSequence']これにより、表示されているエラーメッセージが表示されます。

dict.iteritems()一方、次のような要素を提供するイテレータを提供し('a', 1)ます('b', 2)。次に、ループ内の2つの変数が、forそこにある2つの要素に割り当てられcomment_name == 'a'ますcomment == 1

からのキーを実際に使用していないように見えるため、代わりにparsed_json['results']ループすることもできます。for comment in parsed_json['results'].itervalues()

于 2012-10-04T22:06:58.367 に答える
0
for comment in parsed_json['results']: #'comment' contains keys, not values

する必要があります

for comment in parsed_json['results']['comments']:

parsed_json['results']それ自体が別の辞書です。

parsed_json['results']['comments']繰り返したい辞書のリストです。

于 2012-10-04T22:13:28.630 に答える