Python 带有csv.writer的UnicodeEncodeError

Python 带有csv.writer的UnicodeEncodeError,python,unicode,error-handling,Python,Unicode,Error Handling,请原谅我丑陋的新代码,我正在学习。我从OMDB API中提取电影数据,但当我将其移动到CSV时,许多电影都会出现UnicodeDeerError。可能是因为演员的名字有口音。我想1.)确定哪些电影有问题,2.)跳过它们,和/或3.)最好纠正错误。当发生错误时,我目前所做的只是传递整个过程。寻找一个简单的修复,因为我是新手 import csv import os import json import omdb movie_list = ['A Good Year', 'A Room with

请原谅我丑陋的新代码,我正在学习。我从OMDB API中提取电影数据,但当我将其移动到CSV时,许多电影都会出现UnicodeDeerError。可能是因为演员的名字有口音。我想1.)确定哪些电影有问题,2.)跳过它们,和/或3.)最好纠正错误。当发生错误时,我目前所做的只是传递整个过程。寻找一个简单的修复,因为我是新手

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")

Python2.x:您可以尝试使用以UTF-8编码方式打开csv输出,而不是将open(“Films.csv”,“w”)作为g:

import codecs
with codecs.open('Films.csv', 'w', encoding='UTF-8') as g:
# rest of code
Python3.x:尝试使用
UTF-8
编码打开
g

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

试用
smart\u 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)

如果使用Python2,
csvwriter
并不真正支持Unicode,但是
csv
文档中有一个例子可以解决这个问题。其中一个例子是

如果使用Python 3,则进行以下更改:

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

通过这些更改,文本被解码为Unicode,以便在Python脚本中进行处理,并在写入文件时编码回UTF-8。这是处理Unicode的推荐方法

newline=''
是打开文件供
csv
使用的正确方法。请参阅和
csv
文档


您也可以删除
尝试
/
,但
除外。它只会抑制有用的回溯。

对我有效的解决方案是在导出过程的开头添加:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

我假设您的第一个示例应该使用
编解码器。打开
?谢谢。但是我仍然收到错误:“ascii”编解码器无法对位置2的字符u'\xe9'进行编码:序号不在范围(128)内@Kees这是与上述代码一起发生的,如果是,是哪一行?这可能是由于
json.loads
引起的,您应该能够将其作为参数传递
encoding=“utf-8”
map(lambda x:smart_str(x),…)
可以替换为
map(smart_str,…)
@tadhgmandon-Jensen good catch:)使其变得杂乱无章。。提出建议changes@Kees正如曾经向我建议的那样,说:)谢谢,我将阅读Unicode。然而,奇怪的是,我在:
中得到一个语法错误,将open('BritAir_100Films.csv','w')作为g:
@minocha谢谢,我已经用你的代码工作了!我遗漏了一个括号(除其他外),但最终还是成功了。只是一个注释,如果你做了
csv_字段=[“标题”、“年份”…
,那么你的
数据列表。append
可以简化为
数据列表。append([z[field]表示csv_字段中的字段)]
和csv标题就是
a.writerow(csv_字段)
import sys
reload(sys)
sys.setdefaultencoding('utf8')