2017-01-04 7 views
0

Ich habe ein Dataset, das keine Filme Informationen haben; ich möchte von OMDBapi Film Informationen, um es im JSON-Format hinzufügenJSON-Format extra doppelte Anführungszeichen in Python

ich diesen Code in Python 3.5 schreibe dies für mich zu tun:

import urllib.request 
import csv 
import json 
import datetime 
from collections import defaultdict 
from urllib import response 
i=0 
columns = defaultdict(list) 
with open('C:\dataset\dataset.dat') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
    for (k,v) in row.items(): 
     columns[k].append(v) 
with open('C:\dataset\dataset.dat','r',encoding='utf-8') as csvinput: 
    with open('C:\dataset\dataset_edited.dat', 'w',encoding='utf-8') as csvoutput: 
    writer = csv.writer(csvoutput) 
    for row in csv.reader(csvinput): 
     if row[0] == "user_id": 
      writer.writerow(row+["movie_in_json_format"]) 
     else: 
       movieJson=urllib.request.urlopen("http://www.omdbapi.com/?i=tt"+str(columns['item_id'][i])+"&y=&plot=short&r=json").read() 
       movieJson=movieJson.decode('utf-8') 
       writer.writerow(row+[movieJson]) 
       i=i+1 

JSON-Format wurde in der Datei in diesem Format writed:

"{""Title"":""CitizenDog"",""Year"":""2004"",""Rated"":""N/A"",""Released"":""09 Mar 2006"",""Runtime"":""100 min"",""Genre"":""Comedy, Fantasy, Romance"",""Director"":""Wisit Sasanatieng"",""Writer"":""Koynuch (novel), Wisit Sasanatieng"",""Actors"":""Mahasamut Boonyaruk, Saengthong Gate-Uthong, Sawatwong Palakawong Na Autthaya, Nattha Wattanapaiboon"",""Plot"":""Pod is a man without a dream. He's a country bumpkin who comes to work at a tinned sardine factory in Bangkok. One day, Pod chops off his finger and packs it in the can, prompting him to go..."",""Language"":""Thai, English, Mandarin"",""Country"":""Thailand"",""Awards"":""2 wins & 1 nomination."",""Poster"":""http://ia.media-imdb.com/images/M/MV5BY2VlNDQwZTct[email protected]._V1_SX300.jpg"",""Metascore"":""N/A"",""imdbRating"":""7.5"",""imdbVotes"":""1,544"",""imdbID"":""tt0444778"",""Type"":""movie"",""Response"":""True""}" 

während das sollte so sein:

{"Title":"Citizen Dog","Year":"2004","Rated":"N/A","Released":"09 Mar 2006","Runtime":"100 min","Genre":"Comedy, Fantasy, Romance","Director":"Wisit Sasanatieng","Writer":"Koynuch (novel), Wisit Sasanatieng","Actors":"Mahasamut Boonyaruk, Saengthong Gate-Uthong, Sawatwong Palakawong Na Autthaya, Nattha Wattanapaiboon","Plot":"Pod is a man without a dream. He's a country bumpkin who comes to work at a tinned sardine factory in Bangkok. One day, Pod chops off his finger and packs it in the can, prompting him to go...","Language":"Thai, English, Mandarin","Country":"Thailand","Awards":"2 wins & 1 nomination.","Poster":"http://ia.media-imdb.com/images/M/MV5BY2VlNDQwZTct[email protected]._V1_SX300.jpg","Metascore":"N/A","imdbRating":"7.5","imdbVotes":"1,544","imdbID":"tt0444778","Type":"movie","Response":"True"} 

was kann ich tun, um zu schreiben Diese JSON in Datei im richtigen Format?

~ beachten Sie, dass "encoding = 'utf-8'", ergänzt i/o der Datei aufgrund dieses Fehlers:

'charmap' codec can't encode character '\xf3' in position 3152: character maps to <undefined> 
+1

Ich denke, der bestimmte CSV-Dialekt, den Sie verwenden, erfordert das Abrücken von Anführungszeichen in zwei Anführungszeichen. Denken Sie darüber nach, wie würde ein CSV-Parser die resultierende CSV-Datei lesen? – roeland

+0

@roeland ich weiß nicht, dass :( – Hossein

+0

Versuchen Sie, diese Datei erneut mit dem CSV-Parser-Modul zu lesen, sollten Sie die ursprüngliche Zeichenfolge zurück. Als Alternative könnten Sie Ihre Datendatei vollständig als JSON-Datei schreiben, anstatt zu wickeln JSON in CSV, das wird später einfacher zu analysieren sein – roeland

Antwort

0

Problem mit diesen Codes gelöst:

import urllib.request 
import csv 
import datetime 
from collections import defaultdict 
from urllib import response 
i=0 
columns = defaultdict(list) 

with open('C:\dataset\dataset.dat',encoding='utf-8') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     for (k,v) in row.items(): 
      columns[k].append(v) 
with open('C:\dataset\dataset.dat','r',encoding='utf-8') as csvinput: 
    f_writ = open('C:\dataset\dataset_edited.csv', 'w',encoding='utf-8') 
    csvReader = csv.reader(csvinput) 
    writer = csv.writer(f_writ, delimiter=',', 
       lineterminator='\r\n', 
       quotechar = "'" 
       ) 
    for row in csvReader: 
     if row[0] == "user_id": 
      writer.writerow(row+["movie_in_json_format"]) 
     else: 
      moviejson=urllib.request.urlopen("http://www.omdbapi.com/?i=tt"+str(columns['item_id'][i])+"&y=&plot=short&r=json").read() 
      moviejson=moviejson.decode('utf-8') 
      writer.writerow(row+[moviejson]) 
      i=i+1 
+0

Dank dieses [link] (http://stackoverflow.com/questions/25056881/write-csv-file -mit-doppelten Anführungszeichen-für-bestimmte-Spalte-nicht-arbeiten) – Hossein

-1

Wenn nichts anderes hilft, mit Nachdruck die zusätzlichen Anführungszeichen Streifen:

writer.writerow([field.strip('"') for field in row+[movieJson]]) 
+0

Ich teste es, aber das Problem bleibt immer noch ... – Hossein

0

können Sie eine Probe des Dataset.dat geben?

+0

hier ist eine Zeile Beispiel dafür: [link] (https://github.com/sidooms/MovieTweetings/tree/master/recsyschenallen2014#the- Trainings-Set-für-Training) – Hossein

Verwandte Themen