如何将json文件转换为列表

时间:2019-04-16 12:08:48

标签: python json

我的json文件的内容为:

{'user': 'fgb59h', 'stars': 4.0, 'time': 1027296000}

{'user': 'bucho_ky', 'stars': 2.0, 'time': 1201305600}

{'user': 'redp944', 'stars': 4.0, 'time': 1118016000}

我想这样转换:

[
{"user": "fgb59h", "stars": 4.0, "time": 1027296000}

{"user": "bucho_ky", "stars": 2.0, "time": 1201305600}

{"user": "redp944", "stars": 4.0, "time": 1118016000}
]

我将单引号转换为双引号,如下所示:

with open('ep.json', 'r') as myfile:
    data=myfile.read()
obj = json.dumps(data)
json_ep = obj.replace("'", "\"")

但是现在我需要将json文件包含在列表中。有什么办法吗?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您将无法使用json来立即加载此文件。您必须先替换所有单个查询器,然后使用json.loads加载数据。但是,您也可以使用ast来读取单引号的json,如下所示:

import ast
from io import StringIO

data = """
{'user': 'fgb59h', 'stars': 4.0, 'time': 1027296000}

{'user': 'bucho_ky', 'stars': 2.0, 'time': 1201305600}

{'user': 'redp944', 'stars': 4.0, 'time': 1118016000}
"""

records = list()
for line in StringIO(data).readlines():
    if not len(line.strip()): continue
    data_dict = ast.literal_eval(line)
    records.append(data_dict)

print(records)

哪个输出:

[{'stars': 4.0, 'time': 1027296000, 'user': 'fgb59h'},
 {'stars': 2.0, 'time': 1201305600, 'user': 'bucho_ky'},
 {'stars': 4.0, 'time': 1118016000, 'user': 'redp944'}]

答案 1 :(得分:0)

您可以阅读每一行,并追加到列表中,以后可以使用ast进行操作:

commitJson.json:

{'user': 'fgb59h', 'stars': 4.0, 'time': 1027296000}
{'user': 'bucho_ky', 'stars': 2.0, 'time': 1201305600}
{'user': 'redp944', 'stars': 4.0, 'time': 1118016000}

因此

import json
import ast
res = []
with open('commitJson.json', 'r') as fp:
    for line in fp:
        res.append(line.strip())

print(json.dumps([ast.literal_eval(i) for i in res], indent = 4))

输出

[
    {
        "user": "fgb59h",
        "stars": 4.0,
        "time": 1027296000
    },
    {
        "user": "bucho_ky",
        "stars": 2.0,
        "time": 1201305600
    },
    {
        "user": "redp944",
        "stars": 4.0,
        "time": 1118016000
    }
]

缩略语版

with open('commitJson.json', 'r') as fp:
     print(json.dumps([ast.literal_eval(line.strip()) for line in fp], indent = 4))