2014-02-05 59 views
2

我將我的電影評級從IMDB轉移到Trakt。我使用Python腳本來做到這一點,並且無法讓我的列表變成可序列化的JSON。 我的腳本由JSON上傳器和CSV閱讀器組成,兩者都單獨工作。Python 27 CSV到JSON POST

我已經看過列表與元組,json.dumps選項和語法,並進入json.encoder。網上有很多可用的主題,但沒有完整的CSV到JSON示例。

以下腳本包含所有步驟和幾行示例數據。如果您要測試此腳本,則需要Trakt帳戶的用戶名,pass-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)) 

回答

0

構建字典:

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

而不是調用json.dumps(content),這將創建一個字符串。

您可以創建使用list comprehension類型的字典的列表和dict 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)) 
+0

謝謝!美麗。對於魯莽的複製/傳播者(像我一樣)使用這個:欄目'年份'和'評分'被切換:)翻轉第8列和第11列以解決問題。 – Thijs

+0

糟糕,感謝您的糾正。 – unutbu