Python 将ASCII输出转换为UTF-8

Python 将ASCII输出转换为UTF-8,python,json,csv,utf-8,Python,Json,Csv,Utf 8,我很快就有了一个脚本,可以从纽约时报API获取JSON,然后将其转换为CSV。但是,我偶尔会遇到以下错误: UnicodeEncodeError:“ascii”编解码器无法在中对字符u'\u201c'进行编码 位置21:序号不在范围内(128) 我想,如果我将输出转换为UTF-8,我可以避免这一切,但我不确定如何做到这一点。以下是我的python脚本: import urllib2 import json import csv outfile_path='/NYTComments.csv'

我很快就有了一个脚本,可以从纽约时报API获取JSON,然后将其转换为CSV。但是,我偶尔会遇到以下错误:

UnicodeEncodeError:“ascii”编解码器无法在中对字符u'\u201c'进行编码 位置21:序号不在范围内(128)

我想,如果我将输出转换为UTF-8,我可以避免这一切,但我不确定如何做到这一点。以下是我的python脚本:

import urllib2
import json
import csv

outfile_path='/NYTComments.csv'

writer = csv.writer(open(outfile_path, 'w'))

url = urllib2.Request('http://api.nytimes.com/svc/community/v2/comments/recent?api-key=ea7aac6c5d0723d7f1e06c8035d27305:5:66594855')

parsed_json = json.load(urllib2.urlopen(url))

print parsed_json

for comment in parsed_json['results']['comments']:
    row = []
    row.append(str(comment['commentSequence']))
    row.append(str(comment['commentBody']))
    row.append(str(comment['commentTitle']))
    row.append(str(comment['approveDate']))
    writer.writerow(row)
有几件事

  • 我对《纽约时报》的API一无所知,但我猜您可能不应该发布带有“API密钥”的代码片段。这一点只是猜测(我以前从未使用过此API)

  • 如果您查看,API会告诉您编码。您将在标题中返回以下内容:

    Content-Type=application/json; charset=UTF-8 
    
  • 谷歌搜索“python和UnicodeError”会给你很多帮助。但在这里,你的问题可能是在评论中使用“str”。在这种情况下,它将使用“ascii”编解码器。如果有一个字符超过128,那么爆炸。你得到了你所看到的错误。是一篇关于这个主题的不错的博客文章。读一遍可能会有帮助

编辑:此解决方案适用于我:

for comment in parsed_json['results']['comments']:
    row = []
    row.append(str(comment['commentSequence']))
    row.append(comment['commentBody'].encode('UTF-8', 'replace'))
    row.append(comment['commentTitle'].encode('UTF-8', 'replace'))
    row.append(str(comment['approveDate']))
    writer.writerow(row)
有几件事

  • 我对《纽约时报》的API一无所知,但我猜您可能不应该发布带有“API密钥”的代码片段。这一点只是猜测(我以前从未使用过此API)

  • 如果您查看,API会告诉您编码。您将在标题中返回以下内容:

    Content-Type=application/json; charset=UTF-8 
    
  • 谷歌搜索“python和UnicodeError”会给你很多帮助。但在这里,你的问题可能是在评论中使用“str”。在这种情况下,它将使用“ascii”编解码器。如果有一个字符超过128,那么爆炸。你得到了你所看到的错误。是一篇关于这个主题的不错的博客文章。读一遍可能会有帮助

编辑:此解决方案适用于我:

for comment in parsed_json['results']['comments']:
    row = []
    row.append(str(comment['commentSequence']))
    row.append(comment['commentBody'].encode('UTF-8', 'replace'))
    row.append(comment['commentTitle'].encode('UTF-8', 'replace'))
    row.append(str(comment['approveDate']))
    writer.writerow(row)

用unicode()替换对str()的第二个和第三个调用


用unicode()替换对str()的第二个和第三个调用


完整的错误跟踪是什么样子的?错误起源于哪里?writer.writerow(行)中的第21行完整的错误跟踪是什么样子的?错误来自哪里?第21行,在writer.writerow(行)中,我实际上认为它被正确解析为Unicode,错误出现在一个
str
调用中,这就是为什么我要求澄清。@markransem-是的。我打赌你可能是对的。但是,我想指出一个事实,他已经发布了他的密钥(我猜应该是私有的),并且他可以通过查看响应头找到编码。他似乎在猜测他在处理什么编码。我会改变我的答案。你是对的,我应该把钥匙藏起来,但它们真的不值钱。任何有电子邮件的人都可以得到一封。当我将编码更改为unicode时,仍然会遇到相同的错误。@ChrisJ.Vargo我真的不知道密钥的值。看起来就像一个可能的复制/粘贴“oopsy”。comment['commentBody'].encode('UTF-8','ignore')不起作用?我实际上认为它被正确解析为Unicode,错误出现在一个
str
调用中,这就是为什么我要求一些澄清。@markransem-是的。我打赌你可能是对的。但是,我想指出一个事实,他已经发布了他的密钥(我猜应该是私有的),并且他可以通过查看响应头找到编码。他似乎在猜测他在处理什么编码。我会改变我的答案。你是对的,我应该把钥匙藏起来,但它们真的不值钱。任何有电子邮件的人都可以得到一封。当我将编码更改为unicode时,仍然会遇到相同的错误。@ChrisJ.Vargo我真的不知道密钥的值。看起来就像一个可能的复制/粘贴“oopsy”。注释['commentBody']。编码('UTF-8','ignore')不起作用?