Запись DataFrame в закодированный JSON Newline Delimited - PullRequest
0 голосов
/ 04 ноября 2018

В Python 2.7 у меня есть Pandas Dataframe с несколькими юникодными столбцами, целочисленными столбцами и т. Д. Мне нужно иметь возможность записать его в кодированном формате utf-8 в файл JSON Newline Delimited.

Я пробовал это, но это работает только в Python 3, а не Python 2.7.

with io.open('myjson.json','w',encoding='utf-8') as f:
    f.write(df.to_json(orient="records", lines=True, force_ascii=False))

Это результат моей попытки, но, как вы можете видеть, он не закодирован utf-8.

{"account_id":"support","case_id":7697,"message":"\u0633\u0628 \u0627\u0644\u0644\u0647\u0627\u0644\u0644\u0647 \u0627\u0644\u0639","created_at":1536606086392,"agent":"108915"} 
{"account_id":"support","case_id":7697924,"message":"\u0647\u0627\u064a","created_at":1536601516354,"agent":"108915"}

Я думаю, что это как-то связано с этим . Но я не уверен.

Другое исследование, которое я провел, показывает, что если я добавлю это в свой код, это будет работать. Но я также читал, что это не рекомендуется.

import sys
reload(sys)  
sys.setdefaultencoding('utf8')

1 Ответ

0 голосов
/ 04 ноября 2018

edit - я пропустил 2.7 часть - я обычно использую 3.5 или выше. В любом случае, с помощью Python 2.7 мне удалось преобразовать строку Юникода в utf-8 с помощью кодеков:

import codecs 
codecs.unicode_escape_decode(a['message'])[0].encode("utf-8") 
'\xd8\xb3\xd8\xa8 \xd8\xa7\xd9\x84\xd9\x84\xd9\x87\xd8\xa7\xd9\x84\xd9\x84\xd9\x87 \xd8\xa7\xd9\x84\xd8\xb9' 

Старый ответ -

Похоже, что pandas .to_json () имеет настройку по умолчанию: sure_ascii = True, которая преобразует non ascii в Unicode.

Из документов:

to_json(path_or_buf=None, orient=None, date_format=None, double_precision=10, force_ascii=True, date_unit='ms', default_handler=None, lines=False, compression=None, index=True)

Попробуйте установить значение False:

df.to_json(force_ascii=False)
'{"agent":{"0":"108915"},"created_at":{"0":1536606086392},"message":{"0":"سب اللهالله الع"}}'

Редактировать - Забыл, что вы искали новую строку,

>>> df.to_json(force_ascii=False, orient="records")
[{"agent":"108915","created_at":1536606086392,"message":"سب اللهالله الع"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...