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