将python字典附加到csv

时间:2012-10-04 21:54:20

标签: python json csv dictionary

我正在尝试将一些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'
        }]
    }
}

2 个答案:

答案 0 :(得分:2)

看起来你犯了一个我一直犯的错误。而不是

for comment in parsed_json['results']:

你想要

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

(如果您使用的是Python 3,则为.items()。)

只是在字典上进行迭代(如parsed_json['results']可能是),为您提供字典的,而不是元素。如果你这样做

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

然后thing将循环“a”和“b”。

然后,因为该键显然是一个字符串,所以您尝试执行"some_name"['commentSequence']之类的操作,这会导致您看到的错误消息。

另一方面,

dict.iteritems()为您提供了一个迭代器,它会为您提供('a', 1)('b', 2)等元素;然后,for循环中的两个变量将分配给那里的两个元素,因此comment_name == 'a'comment == 1就在这里。

由于您似乎没有使用parsed_json['results']中的密钥,因此您也可以循环for comment in parsed_json['results'].itervalues()

答案 1 :(得分: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']是您要迭代的词典列表。