python3 How to read json file, modify and write?

Question:

I am trying to read a json file, modify and then save the modified version.
Unfortunately, the content of the file, instead of being saved, adds another json to the end of the original one.

my code:

with open(os.environ.get("WORKSPACE")+"/test.json", 'r+') as test_file:
    test = json.load(test_file)
    test['COMPONENTS'] = "test components"
    json.dump(test, test_file)

test.json
{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": ""}

after running code
{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": ""}{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": "test components"}

expected result:
{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": "test components"}

Please point out what I am doing wrong

My environment
Python 3.10.9
macos 12.3.1

I try to use w+

Exception has occurred: JSONDecodeError
Expecting value: line 1 column 1 (char 0)
StopIteration: 0

During handling of the above exception, another exception occurred:

  File "/test.py", line 20, in <module>
    test = json.load(test_file)
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Asked By: Pawel

||

Answers:

I think the problem is adding a + to your opening modes. Also note that w+ would truncate the file, so there will be no JSON to read. I think what you should do is:

with open(os.environ.get("WORKSPACE")+"/test.json", 'r') as test_file:
    test = json.load(test_file)
    test['COMPONENTS'] = "test components"

with open(os.environ.get("WORKSPACE")+"/test.json", 'w') as test_file:
    json.dump(test, test_file)
Answered By: UpmostScarab

The easiest way to do it, like UpmostScarab said, is to just open the file twice. If you only want to open it once for some reason, you can read, then seek(0), then write, and finally truncate:

with open(os.environ.get("WORKSPACE")+"/test.json", 'r+') as test_file:
    test = json.load(test_file)
    test['COMPONENTS'] = "test components"
    test_file.seek(0)
    json.dump(test, test_file)
    test_file.truncate()
Answered By: jprebys
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.