2012-12-10 67 views
1

我想創建一個.csv文件,其中包含我已經存儲到Twitter搜索API列表中的數據。我使用我選擇的關鍵字(本例中爲'reddit')保存了最後100條推文,並且我試圖將每條推文保存到.csv文件中的單元格中。我的代碼如下,我返回一個錯誤是:UnicodeEncodeError創建.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) 

回答

6

從Python 2文檔爲csv模塊:

注意

這csv模塊的版本不支持Unicode輸入。此外, 目前有一些關於ASCII NUL字符的問題。 因此,所有的輸入應該是UTF-8或可打印的ASCII以保證安全; 請參閱部分Examples中的示例。

這就是說,你可能可以解析.csv文件了,而無需使用Python的內置Unicode字符串的支持太大困難 - 有也是這個answer

+3

+1。引用的例子甚至似乎對這種情況有一些東西。 – abarnert

0

你意識到這樣的問題正是我假設你有一個很好的理由堅持的Python 2而不是Python的3.也許你想在部署這個背後的Python 3的原因

一個託管網站,可以爲你提供Python 2.7,就是這樣,或者你正在運行一個Python 3尚未被移植到的古老操作系統,或者其他任何東西。

但是,如果沒有,只需切換。 Python 2中的csv模塊不處理Unicode,即使明確地進行了編碼/解碼,也存在一些奇怪的怪癖; Python 3中的所有Unicode都是Unicode,並且依賴於底層的file對象來處理底層字符集。

您需要更改幾件事情,但2to3 -w twitter.py會照顧它,除了可能從open('reddit.csv', 'wb')刪除b