2016-05-27 18 views
1

Entschuldigung mein hässlicher Newb-Code, ich lerne. Ich ziehe Filmdaten aus der OMDB API, aber wenn ich sie in CSV verschiebe, bekomme ich UnicodeEncodeError für viele Filme. Wahrscheinlich weil Schauspieler Namen Akzente haben, zum Beispiel. Ich möchte 1.) identifizieren, welche Filme problematisch sind, 2.) sie überspringen und/oder 3.) vorzugsweise den Fehler korrigieren. Was ich gerade habe passiert gerade die ganze Sache wenn ein Fehler auftritt. Auf der Suche nach einer einfachen Lösung, da ich Anfänger bin.UnicodeEncodeError mit csv.writer

import csv 
import os 
import json 
import omdb 

movie_list = ['A Good Year', 'A Room with a View', 'Anchorman', 'Amélie', 'Annie Hall', 'Before Sunrise'] 

data_list = [] 

textdoc = open('textdoc.txt','w') 

for w in movie_list: 
    x = omdb.request(t=w, fullplot=True, tomatoes=True, r='json') 
    y = x.content 
    z = json.loads(y) 
    data_list.append([z["Title"], z["Year"], z["Actors"], z["Awards"], z["Director"], z["Genre"], z["Metascore"], z["Plot"], z["Rated"], z["Runtime"], z["Writer"], z["imdbID"], z["imdbRating"], z["imdbVotes"], z["tomatoRating"], z["tomatoReviews"], z["tomatoFresh"], z["tomatoRotten"], z["tomatoConsensus"], z["tomatoUserMeter"], z["tomatoUserRating"], z["tomatoUserReviews"]]) 

try: 
    with open('Films.csv', 'w') as g: 
     a = csv.writer(g, delimiter=',') 
     a.writerow(["Title", "Year", "Actors", "Awards", "Director", "Genre", "Metascore", "Plot", "Rated", "Runtime", "Writer", "imdbID", "imdbRating", "imdbVotes", "tomatoRating", "tomatoReviews", "tomatoFresh", "tomatoRotten", "tomatoConsensus", "tomatoUserMeter", "tomatoUserRating", "tomatoUserReviews"]) 
     a.writerows(data_list) 
except UnicodeEncodeError: 
    print("fail") 
+1

nur ein Hinweis, wenn Sie 'csv_fields = [" Titel "," Jahr ", .. etc.]' dann könnte Ihre 'data_list.append' vereinfacht werden zu' data_list.append ([z [Feld] für Feld in csv_fields]) 'und die csv-Header nur' a.writerow (csv_fields) ' –

Antwort

0

smart_str ausprobieren

from django.utils.encoding import smart_str 
data_list.append(map(smart_str, [z['element1'], z['element2']])) 
a.write_row(map(smart_str, ["Title", "Year", "Actors", "Awards", "Director", "Genre", "Metascore", "Plot", "Rated", "Runtime", "Writer", "imdbID", "imdbRating", "imdbVotes", "tomatoRating", "tomatoReviews", "tomatoFresh", "tomatoRotten", "tomatoConsensus", "tomatoUserMeter", "tomatoUserRating", "tomatoUserReviews"])) 
a.write_rows(data_list) 
+0

'map (Lambda x: smart_str (x), ...)' könnte nur mit 'map (smart_str, ...) ersetzt werden' –

+0

@ TadhgMcDonald-Jensen guten Fang :) machte es überladen .. machte die vorgeschlagene Änderungen – minocha

+1

@Kees wie mir einmal vorgeschlagen, sagen Sie [Hallo zu Unicode] (https://kos.gd/posts/say-hello-to-unicode/) :) – minocha

1

Python 2.x: Statt with open("Films.csv", 'w') as g: Sie könnten versuchen, codecs zu verwenden, um die CSV-Ausgabe als UTF-8 Codierung zu öffnen.

import codecs 
with codecs.open('Films.csv', 'w', encoding='UTF-8') as g: 
# rest of code 

Python 3.x: versuchen g mit UTF-8 Codierung öffnen:

with open('Films.csv', 'w', encoding='UTF-8') as g: 
# rest of code. 
+0

Ich nehme an, Ihr erstes Beispiel sollte' codecs.open' verwenden? –

+0

@ TadhgMcDonald-Jensen Ja, danke für den Haken. –

+0

Danke. Allerdings bekomme ich immer noch den Fehler: "Ascii" Codec kann nicht codieren Zeichen u '\ xe9' in Position 2: Ordnungszahl nicht im Bereich (128) – Kees

0

Python Bei der Verwendung von 2, ist csvwriter nicht wirklich Unicode unterstützen, aber Es gibt ein Beispiel in der csv Dokumentation, um es zu umgehen. Ein Beispiel ist in this answer.

Wenn Python 3, dann die folgenden Änderungen vornehmen:

y = x.content.decode('utf8') 

und

with open('Films.csv', 'w', encoding='utf8',newline='') as g: 

Mit diesen Änderungen Text in Unicode decodiert wird für die Verarbeitung innerhalb des Skripts Python, und codiert zurück auf UTF -8 wenn in eine Datei geschrieben. Dies ist die empfohlene Methode zum Umgang mit Unicode.

newline='' ist der richtige Weg, um eine Datei für csv verwenden zu öffnen. Siehe this answer und die csv Dokumente.

Sie können auch die try/except entfernen. Es unterdrückt nur nützliche Rückverfolgungen.

Verwandte Themen