创建.csv文件时出现UnicodeEncodeError

时间:2012-12-10 00:06:03

标签: python csv urllib2

我正在尝试创建一个.csv文件,其中包含我存储在Twitter搜索API列表中的数据。我用我选择的关键字(在这种情况下为'reddit')保存了最后100条推文,我试图将每条推文保存到.csv文件中的单元格中。我的代码在下面,我返回的错误是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 0: ordinal not in range(128)

如果有人知道我能做些什么来解决这个问题,我将不胜感激!

import sys
import os


import urllib
import urllib2
import json
from pprint import pprint
import csv

import sentiment_analyzer

import codecs

class Twitter:
    def __init__(self):
        self.api_url = {}
        self.api_url['search'] = 'http://search.twitter.com/search.json?'

    def search(self, params):

        url = self.make_url(params, apitype='search')
        data = json.loads(urllib2.urlopen(url).read().decode('utf-8').encode('ascii',     'ignore'))

        txt = []
        for obj in data['results']:
            txt.append(obj['text'])

        return '\n'.join(txt)

    def make_url(self, params, apitype='search'):


        baseurl = self.api_url[apitype] 
        return baseurl + urllib.urlencode(params)


if __name__ == '__main__':
    try:
        query = sys.argv[1]
    except IndexError:
        query = 'reddit'

    t = Twitter()

    s = sentiment_analyzer.SentimentAnalyzer()

    params = {'q': query, 'result_type': 'recent', 'rpp': 100}

    urlName = t.make_url(params)
    print urlName
    txt = t.search(params)

    print s.analyze_text(txt)

    myfile = open('reddit.csv', 'wb')
    wr = csv.writer(myfile, quoting=csv.QUOTE_MINIMAL)
    wr.writerow(txt)

2 个答案:

答案 0 :(得分:6)

来自csv模块的Python 2文档:

  

注意

     

此版本的csv模块不支持Unicode输入。也,   目前有一些关于ASCII NUL字符的问题。   因此,所有输入应为UTF-8或可打印的ASCII以确保安全;   请参阅Examples部分中的示例。

也就是说,您可以使用Python的内置Unicode字符串支持自己解析.csv文件而不会太困难 - 还有answer

答案 1 :(得分:0)

你意识到这种问题正是Python 3背后的原因。

我假设你有充分的理由坚持使用Python 2而不是Python 3.也许你正试图在托管网站上部署这个,它为你提供Python 2.7就是这样,或者你正在运行一个古老的Python 3尚未移植到的操作系统,或者其他什么。

但如果没有,只需切换。 Python 2中的csv模块不处理Unicode,即使你明确地编码/解码,它也有一些奇怪的怪癖; Python 3中的一个都是Unicode,并依赖于底层file对象来处理底层字符集。

您需要更改一些内容,但2to3 -w twitter.py会处理所有内容,但可能会从b删除open('reddit.csv', 'wb')