编写单独的JSON条目Python的麻烦

时间:2014-10-13 22:49:02

标签: python json file-io

希望有人能告诉我为什么会这样。我这里有三部电影,我试图系统地获取电影的JSON数据的每一个,并将它们打印到一个名为data_fetch.txt的单独文件中。我正在使用的网站是omdbapi.com。我能够成功地获得所有电影的JSON,但出于一些奇怪的原因,当它被写入时,它被写为一个条目。因此,当我打开我刚刚编写的文件并对条目进行计数时,计数器只会在应该有3个单独的条目时吐出1个条目。因此,3个电影片名应该有3个JSON。我想将每个JSON分成它自己的条目的原因是因为我想获取它在JSON中的“类型”。此外,我不确定这是否与问题有关,但当我将每个JSON条目打印到python解释器时,我得到此错误ValueError:额外数据:

以下是代码:

import urllib2, time, csv, json, re
def get_url(title):
    base_url = 'http://www.omdbapi.com/?i=&t='
    title_url = str(title)
    total_url = base_url + title_url
    return total_url

def get_json():
    file = open('data_fetch.txt', 'wb')
    lst = [['2010', 'Colin Firth', "The King's Speech "], ['2009', 'Jeff Bridges', 'Crazy Heart '], ['2008', 'Sean Penn', 'Milk ']]
    for item in lst:
        movie = item[2].strip()
        if ' ' in movie:
            title = movie.replace(' ', '%20')
        else:
            title = movie

        reply = urllib2.urlopen(get_url(title))
        html_doc = reply.read()
        file.write(html_doc)
        print html_doc

        time.sleep(5)
    file.close()
def counter():
    file = open('data_fetch.txt', 'rU')
    counter = 0 
    for entry in file: 
        counter+=1
    return counter
    file.close()

print counter() # this only prints 1

def json_data():
    file = open('data_fetch.txt', 'rU')
    for entry in file: 
        decoded = json.loads(entry)
        print decoded
    file.close()
jsond_data() #ValueError: Extra data:

希望有人可以帮助我,过去3个小时我一直在努力解决这个问题。我正在使用Python 2.7。

更新:这是我的文件的内容:data_fetch.txt:

{“Title”:“The King's Speech”,“Year”:“2010”,“Rated”:“R”,“Released”:“2010年12月25日”,“Runtime”:“118 min”,“类型“:”传记,戏剧,历史“,”导演“:”汤姆胡珀“,”作家“:”大卫塞德勒(剧本)“,”演员“:”科林·弗斯,海伦娜·博纳姆·卡特,德里克·雅各比,罗伯特·门户“ ,“剧情”:“大不列颠及北爱尔兰联合王国的乔治六世国王的故事,他即兴提升到王位,以及帮助不确定的君主的言语治疗师变得配得上它。”,“语言”:“英语“,”国家“:”英国,美国,澳大利亚“,”奖项“:”赢得4项奥斯卡奖。另有104项胜利和136项提名。“,”海报“:”http://ia.media-imdb.com/images/M/MV5BMzU5MjEwMTg2Nl5BMl5BanBnXkFtZTcwNzM3MTYxNA@@._V1_SX300.jpg“,”Metascore“: “88”, “imdbRating”: “8.1”, “imdbVotes”: “355037”, “imdbID”: “tt1504320”, “类型”: “电影”, “响应”: “正确”} { “标题”:” Crazy Heart“,”Year“:”2009“,”Rated“:”R“,”Released“:”2010年2月5日“,”Runtime“:”112 min“,”Genre“:”戏剧,音乐,浪漫“ ,“导演”:“Scott Cooper”,“作家”:“Scott Cooper,Thomas Cobb(小说)”,“演员”:“Jeff Bridges,James Keane,Anna Felix,Paul Herman”,“剧情”:“一位褪色的乡村音乐家被迫重新评估他在失败的浪漫时期的功能失调的生活。“,”语言“:”英语,西班牙语“,”国家“:”美国“,”奖励“:”赢得2次奥斯卡奖。另外35胜& 18个提名。“,”海报“:”http://ia.media-imdb.com/images/M/MV5BMTU0NDc5NjgzNl5BMl5BanBnXkFtZTcwNzc0NDIzMw@@._V1_SX300.jpg“,”Metascore“:”83“,”imdbRating“:”7.3“,”imdbVotes“:”55,547“,”imdbID“:”tt1263670“,”输入“:”movie“,”Response“:”True“} {”Title“:”Milk“,”Year“:”2008“,”Rated“:”R“,”Released“:”2009年1月30日“, “运行时间”:“128分钟”,“流派”:“传记,戏剧,历史”,“导演”:“Gus Van Sant”,“作家”:“Dustin Lance Black”,“演员”:“Sean Penn,Emile Hirsch,Josh Brolin,Diego Luna“,”Plot“:”Harvey Milk的故事,以及他作为美国同性恋活动家的斗争,他为同性恋权利而战,并成为加州第一位公开同性恋当选官员。“,”语言“:”英语“,”国家“:”美国“,”奖项“:”获得2项奥斯卡奖。另外62胜& 95提名。“,”海报“:”http://ia.media-imdb.com/images/M/MV5BMTI2OTM5NjUzMV5BMl5BanBnXkFtZTcwMzY1MTM5MQ@@._V1_SX300.jpg“,”Metascore“:”84“,”imdbRating“:”7.7“,”imdbVotes“:”114,699“,”imdbID“:”tt1013753“,”类型 “:” 电影”, “响应”: “正确”}

1 个答案:

答案 0 :(得分:1)

你必须在每一行的末尾添加一个新行,否则所有行都写在同一行:

file.write(html_doc + '\n')

顺便提一下对代码的一些改进:

import urllib2, time, csv, json, re

def get_url(title):
    base_url = 'http://www.omdbapi.com/?i=&t='
    title = title.strip().replace(' ', '%20')
    return base_url + title


def get_json(lst, filename):
    data = []
    for year, actors, title in lst:
        data.append(urllib2.urlopen(get_url(title)).read())
        time.sleep(5)

    # save data to file
    with open(filename, 'wb') as f:
        json.dump(data, f)


def json_data(filename):
    with open(filename, 'rU') as f: 
        return json.load(f)


def counter(filename):
    return len(json_data(filename))

lst = [['2010', 'Colin Firth', "The King's Speech "], ['2009', 'Jeff Bridges', 'Crazy Heart '], ['2008', 'Sean Penn', 'Milk ']]
filename = 'data_fetch.txt'
get_json(lst, filename)
print counter(filename)
print json_data(filename)