2016-05-27 2 views
1

Простите мой уродливый код newb, я учусь. Я извлекаю данные фильма из API OMDB, но когда я перехожу в CSV, я получаю UnicodeEncodeError для многих фильмов. Вероятно, потому что имена актеров имеют, например, акценты. Я хочу 1.) Определить, какие фильмы являются проблематичными, 2.) пропустить их и/или 3.) предпочтительно исправить ошибку. То, что я в настоящее время просто передает, когда возникает ошибка. Ищете простое исправление, поскольку я новичок.UnicodeEncodeError с 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

просто примечание, если вы сделали 'csv_fields = [" Title "," Year ", .. и т. Д.]', Тогда ваш 'data_list.append' можно было бы упростить до' data_list.append ([z [field] для поле в csv_fields]) 'и заголовки csv просто' a.writerow (csv_fields) ' –

ответ

0

попробовать smart_str

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 (лямбда x: smart_str (x), ...)' может быть заменен просто «map (smart_str, ...)» –

+0

@ TadhgMcDonald-Jensen хороший улов :) делал его загроможденным .. сделал предложенный изменения – minocha

+1

@ Kees, как мне однажды предложили, сказать [Hello to Unicode] (https://kos.gd/posts/say-hello-to-unicode/) :) – minocha

1

Python 2.x: Вместо with open("Films.csv", 'w') as g: вы можете попробовать использовать codecs для того, чтобы открыть выход CSV, как UTF-8 кодирования.

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

Python 3.x: попробуйте открыть g с UTF-8 кодирования:

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

Я предполагаю, что ваш первый пример должен использовать' codecs.open'? –

+0

@ TadhgMcDonald-Jensen Да, спасибо за улов. –

+0

Спасибо. Однако я все еще получаю сообщение об ошибке: кодек ascii не может кодировать символ u '\ xe9' в позиции 2: порядковый номер не в диапазоне (128) – Kees

0

При использовании Python 2, csvwriter действительно не поддерживает Unicode, но в документации csv есть пример, чтобы обойти его. Пример: this answer.

При использовании Python 3, а затем внести следующие изменения:

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

и

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

С учетом этих изменений текста расшифрованных в Unicode для обработки в сценарии Python, и кодируются обратно в UTF -8 при записи в файл. Это рекомендуемый способ работы с Unicode.

newline='' - это правильный способ открыть файл для использования csv. См. this answer и документы csv.

Вы также можете удалить try/except. Он просто подавляет полезные трассировки.

Смежные вопросы