首页 > 解决方案 > 如何在 JSON 文件的不同行上输出字典数组?

问题描述

import json
import csv


def load_matching_data(min_scores,min_stories,min_units):
  array = []
  with open("apartment_building_evaluation.csv", "r") as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=",")
    for column in csv_reader:
      address = column[26]
      if (int(float(column[2])) >= min_stories) and (int(float(column[3]))>= min_units) and ((float(column[24]))>= min_scores):
        dict = {"address" : address, "score": float(column[24]), "num_stories": int(float(column[2])), "num_units": int(float(column[3]))}
        array.append(dict)
    return array
result = load_matching_data(82,28,300)

我得到了这个输出,它是我想要的字典数组

returned value:  [{"address": "252  VICTORIA ST ", "score": 95.0, "num_stories": 37, "num_units": 337}, {"address": "320  TWEEDSMUIR AVE ", "score": 93.0, "num_stories": 30, "num_units": 336}, {"address": "570  BAY ST ", "score": 100.0, "num_stories": 29, "num_units": 463}, {"address": "77  DAVISVILLE AVE ", "score": 90.0, "num_stories": 30, "num_units": 483}, {"address": "85-95  THORNCLIFFE PARK DR ", "score": 93.0, "num_stories": 43, "num_units": 500}, {"address": "561  SHERBOURNE ST ", "score": 99.0, "num_stories": 43, "num_units": 369}, {"address": "140  ERSKINE AVE ", "score": 98.0, "num_stories": 29, "num_units": 493}, {"address": "167  CHURCH ST ", "score": 98.0, "num_stories": 28, "num_units": 388}, {"address": "22  JOHN ST ", "score": 99.0, "num_stories": 31, "num_units": 369}, {"address": "85-95  THORNCLIFFE PARK DR ", "score": 94.0, "num_stories": 43, "num_units": 496}, {"address": "45  DUNFIELD AVE ", "score": 91.0, "num_stories": 30, "num_units": 575}, {"address": "6  FOREST LANEWAY  ", "score": 91.0, "num_stories": 29, "num_units": 406}, {"address": "118  BALLIOL ST ", "score": 86.0, "num_stories": 30, "num_units": 342}, {"address": "500  DUPLEX AVE ", "score": 87.0, "num_stories": 33, "num_units": 319}, {"address": "15  ROEHAMPTON AVE ", "score": 100.0, "num_stories": 36, "num_units": 466}]

我想使用此函数上传到 JSON 文件:

def save_summary(list,string):
  with open('apartment_summary.json', 'w',encoding='utf-8') as outfile:
    json.dump(list, outfile)
  return outfile



save_summary(results, 'apartment_summary.json')#appartment_summary.json is the name of the file.

我已经可以将它上传到 JSON 文件。我的问题是我如何能够将此数组上传到 JSON 文件,其中花括号中的每个字典都打印到不同的行上,如下所示:

    [
    {"address": "252  VICTORIA ST ", "score": 95.0, "num_stories": 37, "num_units": 337},
    {"address": "320  TWEEDSMUIR AVE ", "score": 93.0, "num_stories": 30, "num_units": 336},
    {"address": "570  BAY ST ", "score": 100.0, "num_stories": 29, "num_units": 463},
    {"address": "77  DAVISVILLE AVE ", "score": 90.0, "num_stories": 30, "num_units": 483},
    {"address": "85-95  THORNCLIFFE PARK DR ", "score": 93.0, "num_stories": 43, "num_units": 500},
    {"address": "561  SHERBOURNE ST ", "score": 99.0, "num_stories": 43, "num_units": 369},
    {"address": "140  ERSKINE AVE ", "score": 98.0, "num_stories": 29, "num_units": 493},
    {"address": "167  CHURCH ST ", "score": 98.0, "num_stories": 28, "num_units": 388},
    {"address": "22  JOHN ST ", "score": 99.0, "num_stories": 31, "num_units": 369},
    {"address": "85-95  THORNCLIFFE PARK DR ", "score": 94.0, "num_stories": 43, "num_units": 496},
    {"address": "45  DUNFIELD AVE ", "score": 91.0, "num_stories": 30, "num_units": 575},
    {"address": "6  FOREST LANEWAY  ", "score": 91.0, "num_stories": 29, "num_units": 406},
    {"address": "118  BALLIOL ST ", "score": 86.0, "num_stories": 30, "num_units": 342},
    {"address": "500  DUPLEX AVE ", "score": 87.0, "num_stories": 33, "num_units": 319},
    {"address": "15  ROEHAMPTON AVE ", "score": 100.0, "num_stories": 36, "num_units": 466}
    ]

我曾尝试使用 indent 函数,但它会产生此输出。

[
  {
    "address": "252  VICTORIA ST ",
    "score": 95.0,
    "num_stories": 37,
    "num_units": 337
  },
  {
    "address": "320  TWEEDSMUIR AVE ",
    "score": 93.0,
    "num_stories": 30,
    "num_units": 336
  },
  {
    "address": "570  BAY ST ",
    "score": 100.0,
    "num_stories": 29,
    "num_units": 463
  },
  {
    "address": "77  DAVISVILLE AVE ",
    "score": 90.0,
    "num_stories": 30,
    "num_units": 483
  },
  {
    "address": "85-95  THORNCLIFFE PARK DR ",
    "score": 93.0,
    "num_stories": 43,
    "num_units": 500
  },
  {
    "address": "561  SHERBOURNE ST ",
    "score": 99.0,
    "num_stories": 43,
    "num_units": 369
  },
  {
    "address": "140  ERSKINE AVE ",
    "score": 98.0,
    "num_stories": 29,
    "num_units": 493
  },
  {
    "address": "167  CHURCH ST ",
    "score": 98.0,
    "num_stories": 28,
    "num_units": 388
  },
  {
    "address": "22  JOHN ST ",
    "score": 99.0,
    "num_stories": 31,
    "num_units": 369
  },
  {
    "address": "85-95  THORNCLIFFE PARK DR ",
    "score": 94.0,
    "num_stories": 43,
    "num_units": 496
  },
  {
    "address": "45  DUNFIELD AVE ",
    "score": 91.0,
    "num_stories": 30,
    "num_units": 575
  },
  {
    "address": "6  FOREST LANEWAY  ",
    "score": 91.0,
    "num_stories": 29,
    "num_units": 406
  },
  {
    "address": "118  BALLIOL ST ",
    "score": 86.0,
    "num_stories": 30,
    "num_units": 342
  },
  {
    "address": "500  DUPLEX AVE ",
    "score": 87.0,
    "num_stories": 33,
    "num_units": 319
  },
  {
    "address": "15  ROEHAMPTON AVE ",
    "score": 100.0,
    "num_stories": 36,
    "num_units": 466
  }
]

有人可以向我解释我做错了什么以及如何解决这个问题吗?

标签: pythonjsonpython-3.x

解决方案


这里有一个简单的方法:

import json

result = [{"address": "252  VICTORIA ST ", "score": 95.0, "num_stories": 37, "num_units": 337}, {"address": "320  TWEEDSMUIR AVE ", "score": 93.0, "num_stories": 30, "num_units": 336}, {"address": "570  BAY ST ", "score": 100.0, "num_stories": 29, "num_units": 463}, {"address": "77  DAVISVILLE AVE ", "score": 90.0, "num_stories": 30, "num_units": 483}, {"address": "85-95  THORNCLIFFE PARK DR ", "score": 93.0, "num_stories": 43, "num_units": 500}, {"address": "561  SHERBOURNE ST ", "score": 99.0, "num_stories": 43, "num_units": 369}, {"address": "140  ERSKINE AVE ", "score": 98.0, "num_stories": 29, "num_units": 493}, {"address": "167  CHURCH ST ", "score": 98.0, "num_stories": 28, "num_units": 388}, {"address": "22  JOHN ST ", "score": 99.0, "num_stories": 31, "num_units": 369}, {"address": "85-95  THORNCLIFFE PARK DR ", "score": 94.0, "num_stories": 43, "num_units": 496}, {"address": "45  DUNFIELD AVE ", "score": 91.0, "num_stories": 30, "num_units": 575}, {"address": "6  FOREST LANEWAY  ", "score": 91.0, "num_stories": 29, "num_units": 406}, {"address": "118  BALLIOL ST ", "score": 86.0, "num_stories": 30, "num_units": 342}, {"address": "500  DUPLEX AVE ", "score": 87.0, "num_stories": 33, "num_units": 319}, {"address": "15  ROEHAMPTON AVE ", "score": 100.0, "num_stories": 36, "num_units": 466}]
results = (['[\n'] + [',\n'.join(json.dumps(building) for building in result)] + ['\n]'])
upload_json = ''.join(results)
print(upload_json)

输出:

[
{"address": "252  VICTORIA ST ", "score": 95.0, "num_stories": 37, "num_units": 337},
{"address": "320  TWEEDSMUIR AVE ", "score": 93.0, "num_stories": 30, "num_units": 336},
{"address": "570  BAY ST ", "score": 100.0, "num_stories": 29, "num_units": 463},
{"address": "77  DAVISVILLE AVE ", "score": 90.0, "num_stories": 30, "num_units": 483},
{"address": "85-95  THORNCLIFFE PARK DR ", "score": 93.0, "num_stories": 43, "num_units": 500},
{"address": "561  SHERBOURNE ST ", "score": 99.0, "num_stories": 43, "num_units": 369},
{"address": "140  ERSKINE AVE ", "score": 98.0, "num_stories": 29, "num_units": 493},
{"address": "167  CHURCH ST ", "score": 98.0, "num_stories": 28, "num_units": 388},
{"address": "22  JOHN ST ", "score": 99.0, "num_stories": 31, "num_units": 369},
{"address": "85-95  THORNCLIFFE PARK DR ", "score": 94.0, "num_stories": 43, "num_units": 496},
{"address": "45  DUNFIELD AVE ", "score": 91.0, "num_stories": 30, "num_units": 575},
{"address": "6  FOREST LANEWAY  ", "score": 91.0, "num_stories": 29, "num_units": 406},
{"address": "118  BALLIOL ST ", "score": 86.0, "num_stories": 30, "num_units": 342},
{"address": "500  DUPLEX AVE ", "score": 87.0, "num_stories": 33, "num_units": 319},
{"address": "15  ROEHAMPTON AVE ", "score": 100.0, "num_stories": 36, "num_units": 466}
]

推荐阅读