2017-09-20 89 views
2

大家好,我对python非常陌生,所以只需要忍耐一下。 我有一个这种格式的示例json文件。将地图数组json转换为csv

[{ 
"5":"5", 
"0":"0", 
"1":"1"},{ 
"14":"14", 
"11":"11", 
"15":"15"},{ 
"25":"25", 
"23":"23", 
"22":"22"}] 

我想以特定的方式将json文件转换为csv。应该将json中的1个映射中的所有值即{}转换为csv文件(比如FILE_A.csv)。

对于上面的例子,

FILE_A.csv,

DAILY,COUNT 
5,5 
0,0 
1,1 

FILE_B.csv,

WEEKLY,COUNT 
14,14 
11,11 
15,15 

FILE_C.csv,

MONTHLY,COUNT 
25,25 
23,23 
22,22 

只会有json中的3张地图。

任何人都可以建议将json中的3个地图转换为上述结构的3个不同的csv文件的最佳方式?

在此先感谢。

+0

你在哪里要列名保存在JSON? – Dmitry

+0

@Dmitry:在json列名不存在。我想在三个文件中的每一个中添加列名。 – Rowen

+0

@Rowen这是通过'json'模块的标准读取,在列表中循环并通过'csv'模块输出。我建议你看看一些python的介绍(比如[this](http://www.oreilly.com/programming/free/a-whirlwind-tour-of-python.csp)或[this](http:// www.scipy-lectures.org/intro/language/python_language.html)),进行第一次尝试,然后返回一些您尝试的代码。 –

回答

0
data_list = [{ 
"5":"5", 
"0":"0", 
"1":"1"},{ 
"14":"14", 
"11":"11", 
"15":"15"},{ 
"25":"25", 
"23":"23", 
"22":"22"}] 

temp_dct = { "DAILY": data_list[0], "WEEKLY": data_list[1], "MONTHLY": data_list[2]} 
file_name_ord = 65 
for k in ["DAILY", "WEEKLY", "MONTHLY"]: 
    v = temp_dct[k] 
    file_name = "FILE_"+str(chr(file_name_ord))+".csv" 
    file_name_ord+=1 
    data = k + ","+ "COUNT\n" 
    for inner_k, inner_v in v.items(): 
     data += inner_k + ","+inner_v+"\n" 

    with open(file_name, "w") as f: 
     f.write(data) 

也试试这个。希望你能得到你的答案。

+0

感谢您的帮助 – Rowen

0

您可以使用一个简单的循环与你需要的所有数据,应该是这样的:

jsondata = [{ 
"5":"5", 
"0":"0", 
"1":"1"},{ 
"14":"14", 
"11":"11", 
"15":"15"},{ 
"25":"25", 
"23":"23", 
"22":"22"}] 

for name, timelapse, data in zip(("A", "B", "C"), 
           ("DAILY", "WEEKLY","MONTHLY",), 
           jsondata): #get data together 
    with open("path/to/your/FILE_{}".format(name), "w") as f: 
     f.write("{}, COUNT\n".format(timelapse)) # write header 
     f.write("\n".join(",".join((k,v)) for k,v in data.items())) #write data separated by ',' 

这里有一个live example

而且看一看的csv模块

+0

你能告诉我为什么我得到这个错误'ValueError:需要超过1个值解包'在这一行'f.write(“\ n”.join(“,”。join((k,v)对于数据中的k,v)))? – Rowen

+0

我没有在字典上使用'items'方法,我更新了答案 – Netwave

+0

现在对于同样的语句,它抛出下面的错误'TypeError:sequence item 0:expected string,tuple found'。请帮忙 – Rowen

0

直接的解决方案:

import json, csv  

with open('FILE_A.csv', 'w', newline='') as fa, open('FILE_B.csv', 'w', newline='') as fb, \ 
    open('FILE_C.csv', 'w', newline='') as fc: 

    a_writer, b_writer, c_writer = csv.writer(fa), csv.writer(fb), csv.writer(fc) 
    da, db, dc = json.load(open('your.json')) 

    a_writer.writerow(('DAILY','COUNT')) 
    a_writer.writerows(da.items()) 

    b_writer.writerow(('WEEKLY','COUNT')) 
    b_writer.writerows(db.items()) 

    c_writer.writerow(('MONTHLY','COUNT')) 
    c_writer.writerows(dc.items())