思路:
先把多个JSON元素转换成数组,然后使用python的csv和json模块来处理。
范例格式:
[ { "description": null, "p_w_picpath": { "p_w_picpath_size": 20, "os_family": "centos", "platform": "linux", "p_w_picpath_name": "tomcat-V1.7-基础镜像-V2", "provider": "self", "p_w_picpath_id": "xxxxxxxxx", "processor_type": "64bit", "ui_type": "tui" }, "instance_name": "幽幽", "transition_status": "", "sub_code": 0, "lastest_snapshot_time": "", "cpu_topology": "", "memory_current": 4096, "vxnets": [], "status": "ceased", "vcpus_current": 2, "instance_id": "i-xxxxxx", "instance_type": "c2m4", "instance_class": 0, "dns_aliases": [], "create_time": "2015-03-17T02:06:57Z", "owner": "xxxxxxxxxxxx", "status_time": "2015-03-17T04:14:49Z", "alarm_status": "" } ]
使用方法:
python json2csv.py /tmp/test.json /tmp/test.csv instance_id,instance_name,create_time,vcpus_current,memory_current,status,status_time p_w_picpath
处理结果如下:
i-xxxxxx,xxxxxx,2015-03-17T02:18:34Z,2,4096,ceased,2015-03-17T04:22:04Z,tui,64bit,xxxxxxxxxxxxxxxxxx,20,xxxxxxxx,linux,centos,self
直接上代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import csv
import fcntl
import time
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# 读文件句柄
f_read = open(sys.argv[1])
data = json.load(f_read)
f_read.close()
# 写文件句柄
f_write=open(sys.argv[2],'wb+')
f=csv.writer(f_write)
# 文件锁
fcntl.flock(f_write,fcntl.LOCK_EX)
# 读接下来的变量
del sys.argv[0]
del sys.argv[0]
del sys.argv[0]
# 层级存储要读取的KEY到列表中
if len(sys.argv)>0:
m1=sys.argv[0].split(',')
del sys.argv[0]
else:
m1=[]
if len(sys.argv)>0:
m2=sys.argv[0].split(',')
del sys.argv[0]
else:
m2=[]
if len(sys.argv)>0:
m3=sys.argv[0].split(',')
del sys.argv[0]
else:
m3=[]
# 存储所有要读取的KEY
all_keys=m1+m2+m3
# 打印表头
#print ','.join(all_keys)
#f.writerow(all_keys)
# 逐一打印元素
for item in data:
x=[]
for z in all_keys:
if z in m1:
x+=[str(item[z]).encode('utf-8', 'ignore')]
if z in m2:
x+=item[z].values()
#print ','.join(x)
f.writerow(x)
fcntl.flock(f_write,fcntl.LOCK_UN)
f_write.close()
转载于:https://blog.51cto.com/wangxiaoyu/1655783