这里处理的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=1for 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=1print('字段数:',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+1else:sql_list.append('`'+column+'` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,')i=i+1sql_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+','+datareturn '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_listpath_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=keybase_dir=valueimport_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=0for 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:#如果数据的键是resulttmp1=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数据设置成了nonestring_1=string_1+','+'None'tmp.pop(key)else:string_1 = string_1 + ',' + str(tmp.pop(key))else:if isinstance(tmp.get(key), dict):# 这里给字段值中的json数据设置成了nonestring_1 = string_1 + ',' + 'None'tmp.pop(key)else:string_1 = string_1 + ',' + str(tmp.pop(key))#写入表格的字段值data_string_list_value=str(number)+string_1number+=1print('写入表格的字段值',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:#如果数据的键是resulttmp1=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_1number+=1print('写入表格的字段值',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)