Im trying to create a simple key/value store client that accepts input from a text file like this
list set foo bar get foo list
This is the error I am getting
Traceback (most recent call last): File "hiringAPIv1.py", line 37, in <module> json = json.loads(handle.read()) AttributeError: 'dict' object has no attribute 'loads'
I currently have the whole thing in a for loop to call the url for each new command but I’m having issues with any input file larger than 1 line. Here is my source, i’m using Python.
import urllib import urllib2 import fileinput import json import pprint urlBase = "http://hiringapi.dev.voxel.net/v1/" f = file('input.txt', 'r') for line in f: contents = line.split() #print contents #print len(contents) if len(contents) >= 1: command = contents[0] if len(contents) >= 2: key = contents[1] if len(contents) >= 3: value = contents[2] if command == 'get': urlFinal = urlBase + "key?key=" + key output = key if command == 'set': urlfinal = urlBase + "key?key=" + key + "&value=" + value output = 'status' if command =='list': urlFinal = urlBase + command #if command == 'delete': response = urllib2.Request(urlFinal) try: handle = urllib2.urlopen(response) json = json.loads(handle.read()) #pprint.pprint(json) #pprint.pprint(json['status']) if command == 'list': print str(json['keys']) else: print str(json[output]) except IOError, e: if hasattr(e, 'code'): print e.code if hasattr(e,'msg'): print e.msg if e.code != 401: print 'We got another error' print e.code else: print e.headers print e.headers['www-authenticate'] f.close()
Advertisement
Answer
You replaced your json
module with the results of the .loads()
function:
json = json.loads(handle.read())
Don’t do that. Use a different name to store your data. Use data
perhaps:
data = json.loads(handle.read()) if command == 'list': print(data['keys']) else: print(data[output])
Note that the json
module also has a .load()
function (no s
at the end) that takes a file-like object. Your handle
is such an object, so you can use json.load()
instead and have that read the response:
data = json.load(handle) if command == 'list': print(data['keys']) else: print(data[output])
Note that I pass in just the handle, we don’t call .read()
anymore. I also removed the str()
calls; print
handles that for us.