Let’s start the year with a small piece of code that I could not figure out right off the bat.
It is a side piece of my Web-Scraping series, as manipulating JSONs is a big part of that.
Now with code highlighting!
The problem here is that in order to succesfull json.load(file)
this file needs to content at least two brackets {}
. The easiest way is to create such file before trying to populate it with data.
file_path = 'my.json'
if not os.path.isfile(file_path):
with open(file_path , 'w+', encoding='utf-8') as f:
f.write('{"something": 0}')
f.close()
Basically I check if a file does not exists and open it with w+. I don’t want it to be rewritten if it already exists and contain data I wrote. If there is a finer solution, please share. This whole task tortured me enough to seek it myself.
Don’t forget to use encoding=’utf-8′ if you have any letters but a-Az-Z.
I populated the file with {"something": 0}
in case you want to use jsondata.update()
– it requires for both dicts to be no empty.
And then open this file with r+ and update it.
with open(PATH, 'r+', encoding='utf-8') as jsonFile:
data = json.load(jsonFile)
jsonFile.seek(0)
jsonFile.truncate()
# updating
data.update(to_add)
json.dump(data, jsonFile, ensure_ascii=False)
jsonFile.close()
In order to properly rewrite the file, after you read it, you need to jump back to the 0 symbol and cut everything off.
As I have already said, you can do two things. If you just want to add keys with their respective values, use data.update()
. If not and you want to, say, update a list value of a key, it won’t happen – data.update()
will just replace the old list with the new list. So iterate your keys and update the old dictionary the good old way.
[…] 3. Make a list of things you already processed to not go over them again. This way you won’t have to redo everything all the time. It is easy to do a .txt file, but if you need .json for some reason, jeez, go see my post about updating .json. […]
LikeLike