3

I am attempting to:

  1. Load data from a JSON list of dictionaries
  2. Write the values of a specific key from each dictionary to a file

Yet, when I attempt to dump the key pairs to the new .json file, it only prints the very last dictionary key pair. Anyone know how to loop through each dictionary and append the key pair? I have tried a few methods but I can't seem to figure out what i'm missing and where.

Here is my code:

with open(join(dirname(__file__),'text.json')) as tone_json:
    python_obj = json.load(tone_json)       #read file object into string
    my_list = python_obj["data"]            #assign list name to string

for dictionary in my_list:                  #loop through dictionaries in list
    for key,value in dictionary.items():    #loop through key pairs in dictionaries
        if key == "text":
            with open('comments.json', 'w') as f:
                json.dump("{}: {}".format(key,value), f)    #write key pair objects as json formatted stream to json file
                f.write('\n')

A sample of my JSON file:

{ 
    "data": [
    {
        "text": "apple",
        "created_time": "2017-12-23",
        "comment_count": 154,
        "like_count": 856,
        "id": "1015595299xxxxx"
    },
    {
        "text": "orange",
        "created_time": "2017-12-04",
        "comment_count": 13,
        "like_count": 437,
        "id": "10155952xxxxx"
    },
    {
        "text": "grapes",
        "created_time": "2017-12-04",
        "comment_count": 12,
        "like_count": 163,
        "id": "1015595299xxxxx"
    }
    ]
}

My current output:

"text: grapes"

But, I want to loop through every dictionary and eventually print only the values from each "text" key.

Expected Output:

"text: apple"
"text: orange"
"text: grapes"

Any hints will help! Thanks!

4
  • Why are you using json.dump() when you're practically not writing a JSON? Why not just f.write("{}: {}\n".format(key, value)) instead? Also, open the file in a mode to prevent overwriting of the entries from your previous runs. Commented Apr 25, 2018 at 19:19
  • hm it said the json function had no 'write' attribute. also need json format output to call a separate function Commented Apr 25, 2018 at 19:25
  • Not json.write(...) but f.write(...). Also, while your input file is a JSON file, the data you're attempting to write in the output file most certainly isn't. Commented Apr 25, 2018 at 19:26
  • ahh i see. ill keep that in mind. that may come in handy later using my function call Commented Apr 25, 2018 at 19:29

2 Answers 2

5

You have opened file in w mode, you need to open it into a (append mode)

from docs:

1. 'w' for only writing (an existing file with the same name will be erased)

2. 'a' opens the file for appending; any data written to the file is automatically added to the end

Python 3.6.5 (default, Mar 30 2018, 06:42:10)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> my_list = [{u'created_time': u'2017-12-23', u'text': u'apple', u'comment_count': 154, u'like_count': 856, u'id': u'1015595299xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'orange', u'comment_count': 13, u'like_count': 437, u'id': u'10155952xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'grapes', u'comment_count': 12, u'like_count': 163, u'id': u'1015595299xxxxx'}]
>>> import json
>>> my_list = [{u'created_time': u'2017-12-23', u'text': u'apple', u'comment_count': 154, u'like_count': 856, u'id': u'1015595299xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'orange', u'comment_count': 13, u'like_count': 437, u'id': u'10155952xxxxx'}, {u'created_time': u'2017-12-04', u'text': u'grapes', u'comment_count': 12, u'like_count': 163, u'id': u'1015595299xxxxx'}]
>>> for d in my_list:
...     for key, value in d.items():
...             if key == "text":
...                     with open('comments.json', 'a') as f:  # Append mode here
...                             json.dump("{}: {}".format(key,value), f)
...                             f.write('\n')
...

Contents of comments.json,

"text: apple"
"text: orange"
"text: grapes"

File modes in Python,

'r' open for reading (default)
'w' open for writing, truncating the file first
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newlines mode (deprecated)
Sign up to request clarification or add additional context in comments.

Comments

2

If I did understand you correctly, this should do what you want:

with open('comments.json', 'a') as f:
    json.dump("{}: {}".format(key,value), f)    #write key pair objects as json formatted stream to json file
    f.write('\n')

Just change 'w' to 'a' so you don't overwrite but append to the file

1 Comment

Then please except the answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.