简体   繁体   中英

Python- writing json file as list of dictionaries

I am writing a json file from information extracted from a url. How do I print each element of the dictionary on a separate line?

This is my current code:

dct=[{"name": name,
        "cuisine": cuisine,
        "price-range": price,
        "address": address,
        "rating": rating,
        "reviews": score,
        "district": district,
        "url": link
        }]

    with open('openrice_data.json', 'a') as file:
        file.write(json.dumps(dct))

For example, it currently prints like this:

[{"cuisine": ["Japanese", "Hot Pot", "Buffet"], "rating": [3.5], "address": [22.3825, 114.1901], "url": ["https://www.openrice.com/en/hongkong/r-wagyu-more-sha-tin-japanese-hot-pot-r172321"], "reviews": [35, 17, 8], "name": "Wagyu More", "price-range": ["$101-200"], "district": ["Sha Tin"]}]

I would like it to print like this:

[
{"name": "Chan Kun Kee",
"cuisine": ["Guang Dong", "Dai Pai Dong"],
"price-range": "$51-100",
"address": [22.3884, 114.1958], 
"rating": 3.5,
"reviews": [216, 95, 38],
"district": "Shatin",
"url": "www.openrice.com/en/hongkong/r-chan-kun-kee-sha-tin-guangdong-r7918"
}
]

Don't use json , pprint is perfect for this job.

from pprint import pprint

obj = [{"cuisine": ["Japanese", "Hot Pot", "Buffet"], "rating": [3.5], "address": [22.3825, 114.1901], "url": ["https://www.openrice.com/en/hongkong/r-wagyu-more-sha-tin-japanese-hot-pot-r172321"], "reviews": [35, 17, 8], "name": "Wagyu More", "price-range": ["$101-200"], "district": ["Sha Tin"]}]
with open('dumpfile.json', 'w+') as f:
    pprint(obj, f)

There are a few parameters for customization, please check the doc for more details : https://docs.python.org/3/library/pprint.html

Update Actually what you have is a list of dictionaries. When you want to add more elements you need to remove the [] around the dictionary.

To slve your specific problem you want to use indent=0. Also consider using json.dump directly.

import json

l=[]

dct={"name": 'name',
    "cuisine": 'cuisine',
    "price-range": 'price',
    "address": 'address',
    "rating": 'rating',
    "reviews": 'score',
    "district": 'district',
    "url": 'link'
    }

l.append(dct)

with open('openrice_data.json', 'w') as file:
    json.dump(l,file,indent=0)

Output:

[
{
"name": "name",
"cuisine": "cuisine",
"price-range": "price",
"address": "address",
"rating": "rating",
"reviews": "score",
"district": "district",
"url": "link"
}
]

Continuing

To add more elements you need to do this:

# Load json to list
with open('openrice_data.json') as f:
    l = json.load(f)

# A new dict    
dct2={"name": 'name',
    "cuisine": 'cuisine',
    "price-range": 'price',
    "address": 'address',
    "rating": 'rating',
    "reviews": 'score',
    "district": 'district',
    "url": 'link'
    }

# Append new dict
l.append(dct2)


with open('openrice_data.json', 'w') as file:
    json.dump(l,file,indent=0)

Output now contains a list with 2 dicts.

[
{
"name": "name",
"cuisine": "cuisine",
"price-range": "price",
"address": "address",
"rating": "rating",
"reviews": "score",
"district": "district",
"url": "link"
},
{
"name": "name",
"cuisine": "cuisine",
"price-range": "price",
"address": "address",
"rating": "rating",
"reviews": "score",
"district": "district",
"url": "link"
}
]

Use prettyprinter:

import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(dct)

Also: you are currently putting the dict in a list. [] is a list {} is a dict in python. By putting [{}] you are putting the dict into a list. Just remove the [].

Other people have remarked on using pprint , but I would like to add that pprint prints the representation of the Python values in your dictionary. They are not always the same as their JSON counterparts, for example:

>>> from pprint import pprint
>>> d1 = {"value": None}
>>> pprint(d1)
{'value': None}

(the correct JSON serialization here is {"value": null}

The better option, for these kinds of values, is to use json.dump or json.dumps . You can use the indent parameter to sort of make it print one line per element. Note though that this will also print each list element into their separate lines (so you don't exactly get one line per one JSON key):

>>> d2 = [
... {"name": "Chan Kun Kee",
... "cuisine": ["Guang Dong", "Dai Pai Dong"],
... "price-range": "$51-100",
... "address": [22.3884, 114.1958], 
... "rating": 3.5,
... "reviews": [216, 95, 38],
... "district": "Shatin",
... "url": "www.openrice.com/en/hongkong/r-chan-kun-kee-sha-tin-guangdong-r7918"
... }
... ]
>>> print(json.dumps(d2, indent=2))
[
  {
    "name": "Chan Kun Kee",
    "cuisine": [
      "Guang Dong",
      "Dai Pai Dong"
    ],
    "price-range": "$51-100",
    "address": [
      22.3884,
      114.1958
    ],
    "rating": 3.5,
    "reviews": [
      216,
      95,
      38
    ],
    "district": "Shatin",
    "url": "www.openrice.com/en/hongkong/r-chan-kun-kee-sha-tin-guangdong-r7918"
  }
]

But you're guaranteed to at least always get the correct JSON. Plus, you can also extend the behavior with your own JSON encoder . This allows you, for example, to serialize Python datetime objects into JSON strings.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM