zoukankan      html  css  js  c++  java
  • python json文件转csv/excel

      今天遇到一个问题,有几份json文件需要转csv,网上有很多实现转化的现成代码,但是博主测试之后发现并不好使,因为多数代码都是基于简单深度=1的json数据来实现的,但博主的json数据深度>1,所以也并没有找到现成代码来使用,于是博主只好自己动手:

    # 首先,我们捋一下思路,深度>1,就意味着我们如果单纯的想通过简单循环获取的话,必然要费脑子写一番逻辑,而深度=1时相对就比较容易处理,网上有很多现成资源
    # 所以,我们可以分解实现

     1、将复杂的json数据展开,从深度>1 ---> 深度=1

      实现方法:jsoncsv(python现成的json转csv第三方工具包,没有安装的 pip install jsoncsv 安装一下,经过博主测试发现该工具包直接转csv效果不是很好,数据容易乱,但是用它展开json数据还是非常好用的)   

    jsoncsv -e raw.json expand.json    #将原json文件数据展开 形成新数据文件

      2、将 深度=1 的json数据 ---> csv数据

    #coding=utf-8
    
    import json
    import csv
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    
    json_str = '[{"fav_average": "0", "ranking": "1", "category_ranking": "0", "fan_count": "4,167.9万", "title": "❤️会说话的刘二豆❤️", "comment_average": "5.4万", "ad_coin": 0, "huox_index": 985, "is_lines": "1", "period": "20181111", "ad_share": "4.0万", "fan_quality": "91", "coin_average": "0", "share_average": "40295.1", "up_average": "242.3万", "new_ranking": "1", "last_category_ranking": "0", "video_average": 0, "id": "67241", "pic_url": "https://huox-oa.oss-cn-beijing.aliyuncs.com/media/f723aaacf187937267245c528f4a1800.jpg?x-oss-process=image%2Fformat%2Cjpg&OSSAccessKeyId=jojQCyIiMYJoA2X3&Expires=1550283494&Signature=MSQlnyH7ejqm8I09lJIwcoCydns%3D", "ad_fav": 0}]'
    
    o = json.loads(json_str)
    
    
    def loop_data(o, k=''):
        global json_ob, c_line
        if isinstance(o, dict):
            for key, value in o.items():
                if(k==''):
                    loop_data(value, key)
                else:
                    loop_data(value, k + '.' + key)
        elif isinstance(o, list):
            for ov in o:
                loop_data(ov, k)
        else:
            if not k in json_ob:
                json_ob[k]={}
            json_ob[k][c_line]=o
    
    
    def get_title_rows(json_ob):
        title = []
        row_num = 0
        rows=[]
        for key in json_ob:
            title.append(key)
            v = json_ob[key]
            if len(v)>row_num:
                row_num = len(v)
            continue
        for i in range(row_num):
            row = {}
            for k in json_ob:
                v = json_ob[k]
                if i in v.keys():
                    row[k]=v[i]
                else:
                    row[k] = ''
            rows.append(row)
        return title, rows
    
    
    def write_csv(title, rows, csv_file_name):
        with open(csv_file_name, 'w') as csv_file:
            writer = csv.DictWriter(csv_file, fieldnames=title)
            writer.writeheader()
            writer.writerows(rows)
    
    
    def json_to_csv(object_list):
        global json_ob, c_line
        json_ob = {}
        c_line = 0
        # for ov in object_list :
        # for ov in object_list:
            # loop_data(ov)
            # c_line += 1
        with open("json文件路径.json", "r") as f:
            for ov in f :
                ov = json.loads(ov.strip())
                loop_data(ov)
                c_line += 1
        title, rows = get_title_rows(json_ob)
        write_csv(title, rows, 'csv文件保存路径.csv')
    
    json_to_csv(o)

    至此,csv文件转化完毕。

    从csv转excel文件就不多说了,相信大家都会,excel就可以快速支持。

     # 网上现成的小工具地址:https://json-csv.com/  (每天最多免费转换1M,超过1M下载需要收费)
    
    #             http://kpoda.com/  (看评价好像挺好使的,但是博主用的时候发现并没有反应,大家可以试试)

    希望对你有帮助。

  • 相关阅读:
    Android studio ButterKnife插件
    Android Studio Prettify 插件
    Android studio的主题颜色修改
    MeasureSpec 的三中类型
    android 加载远程Jar、APK
    android源码 键盘消息处理机制
    Android源码阅读笔记二 消息处理机制
    phpstrom 激活
    sublime vue 语法高亮插件安装
    mysql登录报错“Access denied for user 'root'@'localhost' (using password: YES”的处理方法
  • 原文地址:https://www.cnblogs.com/hcy-fly/p/9954393.html
Copyright © 2011-2022 走看看