Unicode / Ascii错误将文本导入Pandas Dataframe

时间:2015-03-22 21:06:31

标签: python facebook pandas ipython

我正在使用Python(2.7)和Requests从Facebook API获取数据,然后使用Pandas通过IPython报告输出。在旅程的某个地方,我遇到了Unicode / Ascii错误,我很难知道要改变什么。

希望解决方案对于精通该领域的人来说是显而易见的。


首先,我使用Requests使用我创建的辅助模块来获取API数据。

_current_request = https://graph.facebook.com/officialstackoverflow/feed?access_token=[Redacted access token]
response = requests.get(_current_request)
由于编码,

Requests.json()会立即失败,所以我一直在使用以下内容:

encoded = response.content.encode("utf-8")  # Excuse verbosity, just trying
json_response = json.loads(encoded)         # to be clear on my thought
response_list = list()                      # process, and hoping it will help
response_list += json_response["data"]      # debugging.

"data"键是FB API的实际内容。它是各个帖子对象的列表)

然后我将response_list对象传回IPython笔记本进行操作。

[1] pd.DataFrame(response_list)

回溯:

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-290-0613adf928ec> in <module>()

/Users/Shared/Sites/Virtualenv/api_manager/lib/python2.7/site-packages/IPython/core/displayhook.pyc in __call__(self, result)
    236                 self.write_format_data(format_dict, md_dict)
    237                 self.log_output(format_dict)
--> 238             self.finish_displayhook()
    239 
    240     def cull_cache(self):

/Users/Shared/Sites/Virtualenv/api_manager/lib/python2.7/site-packages/IPython/kernel/zmq/displayhook.pyc in finish_displayhook(self)
     70         sys.stderr.flush()
     71         if self.msg['content']['data']:
---> 72             self.session.send(self.pub_socket, self.msg, ident=self.topic)
     73         self.msg = None
     74 

/Users/Shared/Sites/Virtualenv/api_manager/lib/python2.7/site-packages/IPython/kernel/zmq/session.pyc in send(self, stream, msg_or_type, content, parent, ident, buffers, track, header, metadata)
    647         if self.adapt_version:
    648             msg = adapt(msg, self.adapt_version)
--> 649         to_send = self.serialize(msg, ident)
    650         to_send.extend(buffers)
    651         longest = max([ len(s) for s in to_send ])

/Users/Shared/Sites/Virtualenv/api_manager/lib/python2.7/site-packages/IPython/kernel/zmq/session.pyc in serialize(self, msg, ident)
    551             content = self.none
    552         elif isinstance(content, dict):
--> 553             content = self.pack(content)
    554         elif isinstance(content, bytes):
    555             # content is already packed, as in a relayed message

/Users/Shared/Sites/Virtualenv/api_manager/lib/python2.7/site-packages/IPython/kernel/zmq/session.pyc in <lambda>(obj)
     83 # disallow nan, because it's not actually valid JSON
     84 json_packer = lambda obj: jsonapi.dumps(obj, default=date_default,
---> 85     ensure_ascii=False, allow_nan=False,
     86 )
     87 json_unpacker = lambda s: jsonapi.loads(s)

/Users/Shared/Sites/Virtualenv/api_manager/lib/python2.7/site-packages/zmq/utils/jsonapi.pyc in dumps(o, **kwargs)
     38         kwargs['separators'] = (',', ':')
     39 
---> 40     s = jsonmod.dumps(o, **kwargs)
     41 
     42     if isinstance(s, unicode):

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, encoding, default, sort_keys, **kw)
    248         check_circular=check_circular, allow_nan=allow_nan, indent=indent,
    249         separators=separators, encoding=encoding, default=default,
--> 250         sort_keys=sort_keys, **kw).encode(obj)
    251 
    252 

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.pyc in encode(self, o)
    208         if not isinstance(chunks, (list, tuple)):
    209             chunks = list(chunks)
--> 210         return ''.join(chunks)
    211 
    212     def iterencode(self, o, _one_shot=False):

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 17915: ordinal not in range(128)

显然,在将这些Unicode对象编码/解码到DataFrame中的路径上存在一个问题,但令我困惑的是,Pandas有一个原生的Unicode对象,所以我不知道为什么Ascii转换正在发生。< / p>

预先感谢您提供任何帮助,请询问我是否需要添加更多信息。


其他信息

我正在查看每个字典键的数据类型,并确认它是子字符串和Unicode对象的混合:

Key: picture, <type 'unicode'>
Key: story, <type 'unicode'>
Key: likes, <type 'dict'>
Key: from, <type 'dict'>
Key: comments, <type 'dict'>
Key: message_tags, <type 'dict'>
Key: privacy, <type 'dict'>
Key: actions, <type 'list'>
Key: updated_time, <type 'unicode'>
Key: to, <type 'dict'>
Key: link, <type 'unicode'>
Key: object_id, <type 'unicode'>
Key: story_tags, <type 'dict'>
Key: created_time, <type 'unicode'>
Key: message, <type 'unicode'>
Key: type, <type 'unicode'>
Key: id, <type 'unicode'>
Key: status_type, <type 'unicode'>
Key: icon, <type 'unicode'>

我已经尝试将其中的每一个重新编码为str,但这也没有帮助 - 而且看起来似乎也没有必要,因为Pandas无论如何都可以处理Unicode。

2 个答案:

答案 0 :(得分:2)

重新作为答案:

这至少是IPython 3.0中的known issue,可能是旧版本。 A fix已合并,并将在IPython 3.1中。

该问题仅影响Python 2。

答案 1 :(得分:1)

我对unicode对象和pandas有类似的问题。需要考虑的几件事情:

  1. 就我而言,它有助于在尝试从中创建数据帧之前查看原始数据,并使用除IPython笔记本之外的编辑器(例如,尝试vim -b Rawfile.txt查找字节订单标记,幻数等)。 .ipynb显示器可以使事物比你想要的更漂亮,这意味着它只是为了显示目的而在引擎盖下做一些事情。某些对象可能与它们出现的不同。

  2. 为我修复的是首先将我的对象传递给编解码器,然后将其保存到文件中,然后再将其转换为数据帧。也许尝试使用部分数据。这也使得尝试不同的编码变得容易。


  3. import codecs
    
    opened = codecs.open(myObject, 'rU', 'UTF16')
    
    df = pandas.DataFrame(opened, index = 'ColName')
    

    1. 正如您可能已经知道的那样,如果缺少值,有时大熊猫会抱怨并且它无法弄清楚如何将所有对象强制转换为对称 形状,例如如果由于您不允许NaN而存在层次索引的嵌套不匹配。

      确保unicode对象的长度与dicts的长度匹配。

      尝试传递列名以使用unicode对象(我猜测可能没有键,dicts的方式),并确保它知道要用于索引的列。