这里处理的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)