簡體   English   中英

UnicodeEncodeError 與 csv.writer

[英]UnicodeEncodeError with csv.writer

請原諒我丑陋的新代碼,我正在學習。 我正在從 OMDB API 中提取電影數據,但是當我將其移動到 CSV 時,我得到了許多電影的 UnicodeEncodeError。 例如,可能是因為演員名字有重音。 我想 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")

Python 2.x:代替with open("Films.csv", 'w') as g:您可以嘗試使用編解碼器以將 csv 輸出打開為UTF-8編碼。

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

Python 3.x:嘗試使用UTF-8編碼打開g

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

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

如果使用 Python 2, csvwriter並不真正支持 Unicode,但csv文檔中有一個示例可以解決它。 這個答案就是一個例子。

如果使用 Python 3,則進行以下更改:

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

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

通過這些更改,文本被解碼為 Unicode 以在 Python 腳本中進行處理,並在寫入文件時編碼回 UTF-8。 這是處理 Unicode 的推薦方法。

newline=''是打開文件以供csv使用的正確方法。 請參閱此答案csv文檔。

您也可以刪除try / except 它只是抑制有用的回溯。

對我有用的解決方案是在導出過程的開頭添加:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM