1

我正在尝试使用已从 Twitter 搜索 API 存储到列表中的数据创建一个 .csv 文件。我已经使用我选择的关键字(在本例中为“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)
4

2 回答 2

6

来自csv模块的 Python 2 文档:

笔记

此版本的 csv 模块不支持 Unicode 输入。此外,目前还有一些关于 ASCII NUL 字符的问题。因此,为了安全起见,所有输入都应该是 UTF-8 或可打印的 ASCII;请参阅示例部分中的示例

也就是说,您可以.csv使用 Python 的内置 Unicode 字符串支持自己解析文件而没有太大困难——也有这个答案

于 2012-12-10T00:10:43.727 回答
0

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

我假设您有充分的理由坚持使用 Python 2 而不是 Python 3。也许您正试图将其部署在为您提供 Python 2.7 的托管站点上,仅此而已,或者您正在运行 Python 的古老操作系统3还没有被移植到,或者其他什么。

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

您将需要更改几件事,但2to3 -w twitter.py会处理所有这些,除了可能删除bfrom open('reddit.csv', 'wb')

于 2012-12-10T01:14:23.897 回答