Python 27 CSV到JSON POST

时间:2014-02-05 15:11:15

标签: python json python-2.7 csv

我正在将我的电影评级从IMDB转移到Trakt 。我使用Python脚本来执行此操作,但无法将其列入可序列化的JSON。 我的脚本包含一个JSON上传器和一个CSV阅读器,两者都可以单独使用。

我查看了list与tuple,json.dumps选项和语法以及json.encoder。在线提供的主题很多,但没有完整的CSV到JSON示例。

以下脚本包括所有步骤和几行示例数据。如果要测试此脚本,则需要Trakt帐户的用户名,密码SHA1和API密钥。


当前错误:

raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: `enter code here`set(['["tt1535108", "Elysium", "8", "2013"]']) is not JSON
serializable

#===============================================================================
# Used CSV file (imdb_ratings.csv)
#===============================================================================
# position,const,created,modified,description,Title,Title type,Directors,You rated,IMDb Rating,Runtime (mins),Year,Genres,Num. Votes,Release Date (month/day/year),URL
# 1,tt1683526,Sat Feb  1 00:00:00 2014,,,Detachment,Feature Film,Tony Kaye,8,7.7,97,2011,drama,36556,2011-04-25,http://www.imdb.com/title/tt1683526/
# 2,tt1205537,Wed Jan 29 00:00:00 2014,,,Jack Ryan: Shadow Recruit,Feature Film,Kenneth Branagh,6,6.6,105,2014,"action, mystery, thriller",11500,2014-01-15,http://www.imdb.com/title/tt1205537/
# 3,tt1535108,Tue Jan 28 00:00:00 2014,,,Elysium,Feature Film,Neill Blomkamp,8,6.7,109,2013,"action, drama, sci_fi, thriller",176354,2013-08-07,http://www.imdb.com/title/tt1535108/

#===============================================================================
# Imports etc.
#===============================================================================
import csv
import json
import urllib2

ifile  = open('imdb_ratings.csv', "rb")
reader = csv.reader(ifile)
included_cols = [1, 5, 8, 11]

#===============================================================================
# CSV to JSON
#===============================================================================
rownum = 0
for row in reader:
    # Save header row.
    if rownum == 0:
        header = row
    else:
        content = list(row[i] for i in included_cols)
        print(content)

    rownum += 1

ifile.close()

#===============================================================================
# POST of JSON
#===============================================================================
data = {
    "username": "<username>",
    "password": "<SHA1>",
    "movies": [
                 {
                 # Expected format: 
                 # "imdb_id": "tt0114746",
                 # "title": "Twelve Monkeys",
                 # "year": 1995,
                 # "rating": 9
                 json.dumps(content)
                 }

              ]
        }

req = urllib2.Request('http://api.trakt.tv/rate/movies/<api>')
req.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(req, json.dumps(data))

1 个答案:

答案 0 :(得分:0)

构建字典:

{
"imdb_id": "tt0114746",
"title": "Twelve Monkeys",
"year": 1995,
"rating": 9
}

而不是调用json.dumps(content),这会创建一个字符串。

您可以使用list comprehensiondict comprehension来创建词条列表:

movies = [{field:row[i] for field, i in zip(fields, included_cols)} for row in reader]

import csv
import json
import urllib2

with open('imdb_ratings.csv', "rb") as ifile:
    reader = csv.reader(ifile)
    next(reader)  # skip header row
    included_cols = [1, 5, 8, 11]
    fields = ['imdb_id', 'title', 'rating', 'year']
    movies = [{field: row[i] for field, i in zip(fields, included_cols)}
              for row in reader]

data = {"username": "<username>",
        "password": "<SHA1>",
        "movies": movies}

req = urllib2.Request('http://api.trakt.tv/rate/movies/<api>')
req.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(req, json.dumps(data))