【问题标题】:Convert map array json to csv将地图数组 json 转换为 csv
【发布时间】:2017-09-20 18:58:11
【问题描述】:

大家好,我对 python 很陌生,所以请耐心等待。 我有一个这种格式的示例 json 文件。

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

我想以特定方式将 json 文件转换为 csv。 1 个映射中的所有值,即 json 中的 {} 应转换为 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 文件的最佳方法?

提前致谢。

【问题讨论】:

  • 你要把列名存储在json的什么地方?
  • @Dmitry:在 json 列名不存在。我想在 3 个文件中的每一个中添加列名。
  • @Rowen 这是相当标准的通过json 模块读取,循环列表并通过csv 模块输出。我建议你看一些python介绍(例如thisthis),先尝试一下,然后再返回一些你尝试过的代码。

标签: python json csv


【解决方案1】:
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)

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

【讨论】:

  • 感谢您的帮助
【解决方案2】:

直截了当的解决方案:

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())

【讨论】:

    【解决方案3】:

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

    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 模块

    【讨论】:

    • 你能告诉我为什么我在这一行ValueError: need more than 1 value to unpack 收到此错误f.write("\n".join(",".join((k,v) for k,v in data)))
    • 我没有在字典上使用items 方法,我更新了答案
    • 现在对于同一个语句,它会抛出以下错误TypeError: sequence item 0: expected string, tuple found。请帮忙
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2019-10-11
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多