将DataFrame写入编码的JSON换行符分隔

时间:2018-11-04 02:24:50

标签: python pandas dataframe

在Python 2.7中,我有一个带有几个unicode列,integer列等的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"}

我认为这与this有关。但是我不确定。

我所做的其他研究表明,如果将其放入代码中,它会起作用。但是我也读到不推荐这样做。

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

1 个答案:

答案 0 :(得分:0)

编辑-我错过了2.7部分-我通常使用3.5或更高版本。无论如何,使用python 2.7,我都能使用编解码器将unicode字符串转换为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,它将非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":"سب اللهالله الع"}]