【问题标题】:How to save a json file using json.dump without the square bracket如何使用不带方括号的 json.dump 保存 json 文件
【发布时间】:2022-11-22 05:51:45
【问题描述】:

我需要保存 json 文件,而不分别以 [] 开头和结尾。

样本数据:

import pandas as pd
import json

df = pd.DataFrame({'name' : ['abc', 'pqr', 'xzy'],
                  'score' : [85, 90, 80],
                  'address' : ['ab street', 'pq street', 'xy ave']})

df
    name    score   address
0   abc 85  ab      street
1   pqr 90  pq      street
2   xzy 80  xy      ave

然后我尝试使用以下方法保存上述数据框:

jl = json.loads(df.to_json(orient='records'))
f = open('expfile.json', 'w')
json.dump(jl, f, indent = 4)
f.close()

输出:

[
    {
        "name": "abc",
        "score": 85,
        "address": "ab street"
    },
    {
        "name": "pqr",
        "score": 90,
        "address": "pq street"
    },
    {
        "name": "xzy",
        "score": 80,
        "address": "xy ave"
    }
]

这很好,但我需要没有开始和结束方括号的输出,如下所示:

{
    "name": "abc",
    "score": 85,
    "address": "ab street"
},
{
    "name": "pqr",
    "score": 90,
    "address": "pq street"
},
{
    "name": "xzy",
    "score": 80,
    "address": "xy ave"
}

有人可以让我知道如何完成同样的事情。 PS 我的许多数据框中的列中都有复杂的嵌套字典/json 结构,我使用ast.literal_eval 解析了它们。

我尝试使用to_json(orient = 'records', lines = True),但我得到了这个错误JSONDecodeError: Extra data: line 2 column 1 (char 425)

【问题讨论】:

  • 那不再是 JSON 文件,因此 JSON 编写者不太可能直接生成它。您可以通过字符串操作(删除这些行,并“取消缩进”一层之间的所有其他内容)或通过自己遍历 jl 并逐一对元素进行 JSON 处理来实现。

标签: python json pandas


【解决方案1】:

jsoning-in-a-loop 变体是这样的:

jl = [
    {
        "name": "abc",
        "score": 85,
        "address": "ab street"
    },
    {
        "name": "pqr",
        "score": 90,
        "address": "pq street"
    },
    {
        "name": "xzy",
        "score": 80,
        "address": "xy ave"
    }
]

import json
print(",
".join(json.dumps(x, indent=4) for x in jl))

产品

{                                                                     
    "name": "abc",                                                        
    "score": 85,                                                          
    "address": "ab street"                                                
},                                                                    
{                                                                     
    "name": "pqr",                                                        
    "score": 90,                                                          
    "address": "pq street"                                                
},                                                                    
{                                                                     
    "name": "xzy",                                                        
    "score": 80,                                                          
    "address": "xy ave"                                                   
}

【讨论】:

  • 如何将它作为 JSON 文件写回文件目录?
  • 正要发布相同的答案,就是这样。要从一个数据框转到这个,只需将您的数据框转换为字典列表:print(", ".join(json.dumps(x, indent=4) for x in df.to_dict(orient="records")))
  • ", ".join(json.dumps(x, indent=4) for x in jl)部分是一个简单的字符串,你可以把它写到一个文件中。 @KarthikS
  • jl1 = ", ".join(json.dumps(x, indent=4) for x in jl)步骤执行json.dump(jl1, f, indent = 4)后,我得到如下输出:"{ "name": "abc", "score": 85, "address": "ab street" }, { "name": "pqr", "score": 90, "address": "pq street" }, { "name": "xzy", "score": 80, "address": "xy ave" }"
  • 你只需要写字符串,不要再写了 json.dump: f = open('yourfile.txt', 'w'); f.write(jl1); f.close()
【解决方案2】:

如果想在输出中删除 [],则可以遍历数据框中的行并一次写出一条记录。

import pandas as pd
import json

df = pd.DataFrame({'name' : ['abc', 'pqr', 'xzy'],
                  'score' : [85, 90, 80],
                  'address' : ['ab street', 'pq street', 'xy ave']})

with open("out.dat", "w") as fout:
    for idx, row in df.iterrows():
        if idx != 0:
            fout.write(',
')
        fout.write(json.dumps(row.to_dict(), indent=4))

输出:

{
    "name": "abc",
    "score": 85,
    "address": "ab street"
},
{
    "name": "pqr",
    "score": 90,
    "address": "pq street"
},
{
    "name": "xzy",
    "score": 80,
    "address": "xy ave"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 2019-04-23
    • 1970-01-01
    • 2021-11-24
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多