JSON格式的文件转csv

这里处理的json文件没有后缀名,下面是处理之前的文件内容
处理前的JSON文件
处理之后的csv文件其实就是正常的excel文件,不一样的是有乱码,因为脚本里面使用的是utf-8编码,这里给出乱码解决方案
使用记事本打开csv,然后另存为选择编码格式为ANSI,之后再打开就是正常的了。有问题可以问我,代码有待完善

#!/usr/bin/env python
# coding=utf-8
#先把数据整合到该目录下面的txt文件,然后对该txt文件操作
import re, os, json

#文件路径处理函数
def path_rotate(base_dir,name):
    path_list=base_dir.split("\\")
    #处理批量存放json文件的路径
    import_file_path=''
    data_export_path_=''
    i=1
    for path in path_list:
        import_file_path=import_file_path+path+'\\\\'
        i=i+1
    #数据 导出路径,按照这种标准写
    data_export_path = 'C:\\数据导出'
    #创建数据导出文件
    if not os.path.exists(data_export_path):
        os.mkdir(data_export_path)
    #处理整合完成的文件,并且接下来的数据都从这里面处理
    import_export_file_path=data_export_path+'\\'+name+'_原始数据整合.txt'
    #处理完成之后的sql文件
    import_export_sql_file_path = data_export_path + '\\\\'+name + '_sql.txt'
    export_file_path = data_export_path + '\\\\'+name + '.csv'
    #顺序是存储json文件的路径,整合json文件的路径,json文件处理好之后的路径,数据表生成sql语句路径
    print(import_file_path,import_export_file_path,export_file_path,import_export_sql_file_path)
    return import_file_path,import_export_file_path,export_file_path,import_export_sql_file_path
#所有的读函数
def read_file(path):
    with open((os.path.join(path)), 'r', encoding='utf-8') as f:
        data=f.read()
    return data
#所有的追加函数
def write_a(path,data):
    with open((os.path.join(path)), 'a+', encoding='utf-8') as f_:
        f_.write(data)
#整合所有的json文件
def union_json_to_txt(fileList,import_export_file_path):
    for i in fileList:
        print('file_name',i)
        data3=read_file(i)
        write_a(import_export_file_path,data3)
#获取字典的头几个键
def get_head_key(data):
    # print('data:',data)
    head_key_lists = []
    for key,value in data.items():
        #如果value的值是字典
        # print('key:',key,'value:',value)
        if not isinstance(value,dict):
            head_key_lists.append(key)
        else:
            for key_,value_ in value.items():
                head_key_lists.append(key_)
    return head_key_lists
#获取表的列名
def get_key_value(data):
    # print('data:',data)
    key_lists = []
    for key,value in data.items():
        #如果value的值是字典
        # print('key:',key,'value:',value)
        if isinstance(value,dict):
            for key_,value_ in value.items():
                if isinstance(value_, list):
                    data_list = value_[0]
                    # print('列表:', data_list, type(data_list))
                    for key__, value__ in data_list.items():
                        key_lists.append(key__)
                    # print('key的列表', key_lists)
                    return key_lists
#获取键值
def get_dict_list(data):
    # print('data:',data)
    key_lists = []
    for key,value in data.items():
        #如果value的值是字典
        # print('key:',key,'value:',value)
        if isinstance(value,dict):
            for key_,value_ in value.items():
                if isinstance(value_, list):
                    return value_
#生成数据库sql命令的函数
def create_sql(path,name,column_list):
    print(column_list)
    sql_list=[]
    sql_list.append('SET NAMES utf8mb4;')
    sql_list.append('SET FOREIGN_KEY_CHECKS = 0;')
    sql_list.append('DROP TABLE IF EXISTS `'+name+'`;')
    sql_list.append('CREATE TABLE `'+name+'`  (')
    sql_list.append('`number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,')
    i=1
    print('字段数:',len(column_list))
    for column in column_list:
        if i == len(column_list):
            sql_list.append('`'+column+'` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL')
            i=i+1
        else:
            sql_list.append('`'+column+'` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,')
            i=i+1
    sql_list.append(') ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;')
    sql_list.append('SET FOREIGN_KEY_CHECKS = 1;')
    sql_str=''
    for sql_string in sql_list:
        sql_str=sql_str+sql_string+'\n'
    with open(path, "a+", encoding='utf-8') as f:
        f.write(sql_str + "\n")
    print(sql_list)
def format(data_list):
    string = ''
    for data in data_list:
        string=string+','+data
    return 'number' + string
#获取文件夹内所有文件路径
def recursion_dir_all_file(path):
    print(path)
    '''
    :param path: 文件夹目录
    '''
    file_list = []
    for dir_path, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(dir_path, file)
            # if "\\" in file_path:
            #     file_path = file_path.replace('\\', '/')
            file_list.append(file_path)
    for file in file_list:
        if file.endswith('.mp4') | file.endswith('.txt') | file.endswith('.csv'):
            file_list.remove(file)
    return file_list

path_and_name={
    #导出数据的表名和路径#注意,这个根路径不能带数字!!!!千万注意不要出现’\‘后面跟了数字如:\9
    '会员管理1':'D:\wudi文件夹\大理案件-78\案件78大理\交付数据2\交付数据\客户管理\会员管理',
    '银行管理1':'D:\wudi文件夹\大理案件-78\案件78大理\交付数据2\交付数据\客户管理\银行管理',
    '充值记录1':'D:\wudi文件夹\大理案件-78\案件78大理\交付数据2\交付数据\交易记录查询\充值记录',
    '提现记录1':'D:\wudi文件夹\大理案件-78\案件78大理\交付数据2\交付数据\交易记录查询\提现记录',
    '存款记录1':'D:\wudi文件夹\大理案件-78\案件78大理\交付数据2\交付数据\人工存提\人工存款记录'
}
#
# name=input("请输入本次处理的数据名:")
# #获取表格字段值文件位置'E:\\案件相关\\大理\\交付数据\\客户管理\\all.txt'
# #注意,这个根路径不能带数字!!!!千万注意
# base_dir = 'E:\案件相关\大理\数据处理\数据处理最新\客户管理\会员管理'
# 顺序是存储json文件的路径,整合json文件的路径,json文件处理好之后的路径,数据表生成sql语句路径
for key,value in path_and_name.items():
    name=key
    base_dir=value
    import_file_path,import_export_file_path,export_file_path,export_sql_file_path=path_rotate(base_dir,name)
    print(import_file_path,import_export_file_path,export_file_path,export_sql_file_path)
    #获取所有的文件名
    file_list=recursion_dir_all_file(import_file_path)
    #整合所有的json文件
    union_json_to_txt(file_list,import_export_file_path)
    data2=read_file(import_export_file_path)
    # 以换行分割所有字符串,返回列表
    data2 = data2.split("\n")
    key_list = []
    #获取列表头
    for data in data2:
        if "msg" in data:
            data_tmp = data.replace("HTTP/1.1 200 ", "")
            data_tmp_json = json.loads(data_tmp)
            #表文件的列名
            key_list = get_key_value(data_tmp_json)
            break
    #调用函数生成数据库表生成字段
    # create_sql(export_sql_file_path,name,key_list)

    #写入文件的标题头
    write_a(export_file_path,format(key_list))
    #获取一行写入数据

    number=0
    for data in data2:
        #循环依据,目前不确定要不要改动,或者写id,要根据情况看
        if "userId" in data:
            data_tmp=data.replace("HTTP/1.1 200 ","")
            data_tmp_json=json.loads(data_tmp)
            head_key_list=get_head_key(data_tmp_json)
            print('head_key_list',head_key_list)
            #如果这个表示数据的是rows
            #存储键值
            list_data_value=[]
            string_1=''
            if 'rows' in head_key_list:
                #如果数据的键是result
                tmp1=data_tmp_json.get("data",{})
                tmp2 = tmp1.get("rows", {})
                # tmp3 = tmp2.get("list", {})
                for tmp in tmp2:
                    #这里不用写id,因为id是自己设置的,有时候自己带id,那么就不需要这个字段了
                    for key in key_list:
                        #循环获取这些数据
                        #print('key:',key,'value:',tmp.get(key))
                        if not isinstance(tmp.get(key),str):
                            if isinstance(tmp.get(key), dict):
                                #这里给字段值中的json数据设置成了none
                                string_1=string_1+','+'None'
                                tmp.pop(key)
                            else:
                                string_1 = string_1 + ',' + str(tmp.pop(key))
                        else:
                            if isinstance(tmp.get(key), dict):
                                # 这里给字段值中的json数据设置成了none
                                string_1 = string_1 + ',' + 'None'
                                tmp.pop(key)
                            else:
                                string_1 = string_1 + ',' + str(tmp.pop(key))
                    #写入表格的字段值
                    data_string_list_value=str(number)+string_1
                    number+=1
                    print('写入表格的字段值',data_string_list_value)
                    with open(export_file_path, "a+", encoding='utf-8') as f:
                        f.write(data_string_list_value + "\n")
                        string_1=''
                        data_string_list_value=''
            else:
                #如果数据的键是result
                tmp1=data_tmp_json.get("data",{})
                tmp2 = tmp1.get("result", {})
                # tmp3 = tmp2.get("list", {})
                for tmp in tmp2:
                    #这里不用写id,因为id是自己设置的,有时候自己带id,那么就不需要这个字段了
                    for key in key_list:
                        #循环获取这些数据
                        #print('key:',key,'value:',tmp.get(key))
                        if not isinstance(tmp.get(key),str):
                            if isinstance(tmp.get(key), dict):
                                string_1=string_1+','+'None'
                                tmp.pop(key)
                            else:
                                string_1 = string_1 + ',' + str(tmp.pop(key))
                        else:
                            if isinstance(tmp.get(key), dict):
                                string_1 = string_1 + ',' + 'None'
                                tmp.pop(key)
                            else:
                                string_1 = string_1 + ',' + str(tmp.pop(key))
                    #写入表格的字段值
                    data_string_list_value=str(number)+string_1
                    number+=1
                    print('写入表格的字段值',data_string_list_value)
                    with open(export_file_path, "a+", encoding='utf-8') as f:
                        f.write(data_string_list_value + "\n")
                        string_1=''
                        data_string_list_value=''
    if os.path.exists(import_export_file_path):
        os.remove(import_export_file_path)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值