2014-10-13 3 views
3

왜 이런 일이 발생했는지 알 수 있기를 바랍니다. 여기서 내가 가진 세 편의 영화는 체계적으로 영화의 JSON 데이터를 모두 얻고 data_fetch.txt라는 별도의 파일로 인쇄하려고합니다. 내가 사용하는 사이트는 omdbapi.com입니다. 모든 영화의 JSON을 성공적으로 가져올 수 있지만, 기묘한 이유 때문에 작성 될 때 모든 항목이 하나의 항목으로 작성됩니다. 따라서 필자가 작성한 파일을 열어 항목 수를 계산할 때 카운터는 3 개의 별도 항목이 있어야 할 때 1 항목 만 뱉어냅니다. 따라서 3 개의 영화 제목에 3 개의 JSON이 있어야합니다. 각 JSON을 자체 항목으로 분리하려는 이유는 JSON에있는 "장르"를 가져 오려고하기 때문입니다. 또한, 나는이이 문제에 연결되어 있는지 확실하지 않습니다,하지만 난이 오류 ValueError를 얻을 파이썬 인터프리터 각 JSON 항목을 인쇄 할 때 : 추가 데이터 :별도의 JSON 항목을 쓰는 데 문제가 있습니다. Python

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 시간 동안 이걸 가지고 놀랐습니다. 파이썬 2.7을 사용하고 있습니다.

업데이트 : data_fetch.txt :

{ "제목": "킹스 스피치", "년": "2010", "정격"여기 내 파일의 내용이다 "R"은 "출시를 ":"25 Dec 2010 ","Runtime ":"118 min ","장르 ":"전기, 연극, 역사 ","감독 ":"Tom Hooper ","작가 ":"David Seidler (시나리오) "배우들": "Colin Firth, Helena Bonham Carter, Derek Jacobi, Robert Portal", "Plot": 영국 대영 제국의 북 조지 6 세 이야기, 즉석 왕좌와 연설 "언어": "영어", "국가": "영국, 미국, 오스트레일리아", "시상식": "수상작 104 점, 또 104 점이 & 개의 추천을 받았습니다." , "포스터": "http://ia.media-imdb.com/images/M/[email protected]@._V1_SX300.jpg", "Metascore": "88", "imdbRat "", "imdbID": "tt1504320", "유형": "영화", "응답": "True"} { "제목": "크레이지 하트", " 2010 년 2 월 5 일 ","런타임 ":"112 분 ","장르 ":"드라마, 음악, 로맨스 ","감독 ":"2009 "," "Scott Cooper", "Writer": "Scott Cooper, Thomas Cobb (소설)", "배우": "Jeff Bridges, James Keane, Anna Felix, Paul Herman", "Plot": "퇴색 한 컨트리 음악 뮤지션이 강제로 "언어": "영어, 스페인어", "국가": "미국", "수상 경력": "2 Oscars를 수상했습니다. 또 다른 35 승 & 18 후보작. ","포스터 ":"http://ia.media-imdb.com/images/M/[email protected]@._V1_SX300.jpg ","Metascore ":"83 ","imdbRating ":"7.3 ","imdbVotes ":"55,547 ","imdbID ":"tt1263670 " 유형 ":"영화 ","응답 ":"True "} {"제목 ":"우유 ","연도 ":"2008 ","등급 ":"R ","출시 ":"2009 년 1 월 30 일 " "런타임": "128 분", "장르": "전기, 연극, 역사", "감독": "거스 반 산트", "작가": "더스틴 랜스 블랙", "배우": "Sean Penn, Emile Hirsch, Josh Brolin, Diego Luna ","Plot ": Harvey Milk의 이야기, 그리고 동성애자의 권리를 위해 싸우고 미국 최초의 공개적으로 게이 인 선출 된 공식이 된 미국 게이 운동가로서의 그의 투쟁.", "언어": "영어 ","Country ":"USA ","Awards ":"2 Oscars를 획득했습니다. 또 다른 62 승 & 95 후보작. ","포스터 ":"http://ia.media-imdb.com/images/M/[email protected]@._V1_SX300.jpg ","Metascore ":"84 ","imdbRating ":"7.7 ","imdbVotes ":"114,699 ","imdbID ":"tt1013753 " 입력 ":"영화 ","응답 ":":

file.write(html_doc + '\n') 

으로 true "}

+0

당신이 'data_fetch.txt'파일 – Powertieke

+0

'파일'의 내용을 게시 할 수는 내장 FUNC 데이터 형식 - 위의 'f'또는 'data_file'또는 다른 것으로 변경하는 것이 좋을 것입니다 ... – slushy

+0

방금 ​​data_file로 파일을 변경했으며 동일한 문제가 발생합니다.나는 하나의 엔트리 만 출력하고있다. –

답변

1

을 당신은 그렇지 않으면 모두가 같은 줄에 기록됩니다, 각 라인의 끝에 새 줄을 추가해야 방법은 당신의 코드에 대한 몇 가지 개선 사항 :?

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) 
+0

이것이 엔트리의 수를 해결하는 반면, JSON 엔트리를 인쇄 할 때마다 나는 이것을 인터프리터에서 얻을 수 있기 때문에 이것이 답 인지는 모르겠다. {u'Response ': u'False ', u'Error': u''Oc''Incorrect IMDb ID '}, 내가 쓰고있는 것에 개행 문자를 추가하고 있기 때문에 이것이겠습니까? –

+0

@jasonadams, 나는 그렇게 생각하지 않는다. 당신의 코드는 끝까지 잘 돌아 간다. 다른 수정을 했습니까? – elyase

+0

흠. 이상 하네. 그래서 결국 JSON 항목을 올바르게 출력 할 수 있을까요? –

관련 문제