2015-09-21 2 views
0

После использования Pandas для чтения json-объекта в Pandas.DataFrame, мы хотим только print первый год в каждой строке pandas. Например: если у нас есть 2013-2014(2015), мы хотим напечатать 2013Python и Pandas: UnicodeDecodeError: кодек ascii не может декодировать байт

Полный код (here)

x = '{"0":"1985\\u2013present","1":"1985\\u2013present",......}' 
a = pd.read_json(x, typ='series') 
for i, row in a.iteritems(): 
    print row.split('-')[0].split('—')[0].split('(')[0] 

следующее сообщение об ошибке:

--------------------------------------------------------------------------- 
UnicodeDecodeError      Traceback (most recent call last) 
<ipython-input-1333-d8ef23860c53> in <module>() 
     1 for i, row in a.iteritems(): 
----> 2  print row.split('-')[0].split('—')[0].split('(')[0] 

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

Почему это происходит? Как мы можем исправить проблему?

ответ

1

Ваши строки данных JSON в юникод строку, которую вы можете увидеть, например, просто печатать одно из значений:

In: a[0] 
Out: u'1985\u2013present' 

Теперь вы пытаетесь разделить строку на юникодом \u2031 (EN DASH), но строка, которую вы даете split, не является строкой unicode (поэтому ошибка 'ascii' codec can't decode byte 0xe2 - EN DASH не является символом ASCII).

Для того, чтобы ваш пример работает, вы можете использовать:

for i, row in a.iteritems(): 
    print row.split('-')[0].split(u'—')[0].split('(')[0] 

Обратите внимание на u перед uncode тира. Вы также можете написать u'\u2013', чтобы разделить строку.

Подробнее о юникоде в Python см. https://docs.python.org/2/howto/unicode.html