Pandas to_json() 中文亂碼


問題出現與解決

Pandas進行數據處理之后,假如想將其轉化為json,會出現一個bug,就是中文文字是以亂碼存儲的,也就是\uXXXXXX的形式,翻了翻官網文檔,查了源碼的參數,確認Pandas不帶該功能=- =.於是又查了很多博客,結果都是解決讀取json時的亂碼問題.並沒有寫入的亂碼問題解決.

於是決定自己寫一個.首先用demojson的類庫嘗試了一下,不行,依舊編碼問題.之后考慮python 原生的 json 應該有編碼轉換功能,查了查官網文檔,確實可以,不過要比平時多加一個參數

listXY_json = json.dumps(listXY, sort_keys=True, indent=4, ensure_ascii=False)
#ensure_ascii:默認值True,如果數據中含有非ASCII的字符,則會類似\uXXXX的顯示數據,設置成False后,就能正常顯示

既然找到解決亂碼的方法,那么想要將pandas中的數據類型存儲到json中就只需要先將其轉換為python自帶的數據類型,再利用 json 類庫其轉換為json格式並存儲就可以了,因為我自己是為了將python處理好的數據轉換為json數組,然后利用echarts生成表格,所以我將其封裝為了一個類,源碼在最后

存儲的的json前后對比

df1 = pd.DataFrame(pd.read_excel(u'excel/袁隆平院士報告處理后.xlsx'))
js001 = df1.to_json()
with open('json/testjson.json', 'w') as f:
  f.write(js001)

# "16":6,"17":6,"18":3,"19":4},"content":{"0":"\u63a5\u5f85\u738b\u7389\u7530\u9662\u58eb\u4e00\u884c","1":"\u5b


#處理后
df1 = pd.DataFrame(pd.read_excel(u'excel/袁隆平院士報告處理后.xlsx'))
dfts = DataFrameToJSONArray(df1, 'json/wyt_xyz.json') # 參數(df數據,文件存儲路徑)
dfts.funChangeDataFrameType() # 自動轉換DataFrame的列數據類型
dfts.funSaveJSONArrayFile() # 存儲JSON格式文件

# [["2016-08-08", "袁隆平院士觀摩指導"], ["2016-08-09","修改完善袁隆平院士項目合作協議"],["2016-08-10","完成袁隆平院士合作協議"],["2016-08-31","袁隆平院士項目入駐院士港協議審核完畢"],....]

DataFrameToJSONArray()源碼

# - * - coding: utf - 8 -*-
#
# 作者:田豐(FontTian)
# 創建時間:'2017/7/16'
# 郵箱:fonttian@Gmaill.com
# CSDN:http://blog.csdn.net/fontthrone
import sys
import pandas as pd
import json
import re

reload(sys)
sys.setdefaultencoding('utf-8')

class DataFrameToJSONArray():
    def __init__(self, dataframe, filepath='DataFrameToJSONArrayFile.json'):
        self.__DataFrame = dataframe
        self.__FilePath = filepath

    def funChangeDataFrameType(self):
        for i in range(len(self.__DataFrame.columns)):
            s = re.sub(r'\'>', '', re.sub(r'\d', '', str(type(self.__DataFrame.iloc[:, i][0])))).replace('\'', ' ').replace('.',
                                                                                                               ' ').split(
                ' ')[-1]
            if s == 'Timestamp':
                self.__DataFrame.iloc[:, i] = self.__DataFrame.iloc[:, i].astype(unicode)
            else:
                self.__DataFrame.iloc[:, i] = self.__DataFrame.iloc[:, i].astype(s)
        return self.__DataFrame

    def funSaveJSONArrayFile(self):
        list001 = []
        for i in range(len(self.__DataFrame.columns)):
            list001.append(list(self.__DataFrame.iloc[:, i]))

        list002 = []
        list003 = []

        for i in range(len(list001[0])):
            for j in range(len(self.__DataFrame.columns)):
                list003.append(list001[j][i])
            list002.append(list003)
            list003 = []

        Final_JSON = json.dumps(list002, sort_keys=True, indent=4, ensure_ascii=False)
        with open(self.__FilePath, 'w') as f:
            f.write(Final_JSON)
        return Final_JSON
  • def init(self, dataframe, filepath=’DataFrameToJSONArrayFile.json’) dataframe需要傳入的數據,filepath,json文件存儲路徑
  • funChangeDataFrameType() 自動轉換DataFrame數據類型,返回轉換后的DataFrame
  • funSaveJSONArrayFile() 保存文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM