Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

strange python issue, 'unicode' object has no attribute 'read'

Here is my code and does anyone have any ideas what is wrong? I open my JSON content directly by browser and it works,

data = requests.get('http://ws.audioscrobbler.com/2.0/?method=library.getartists&api_key=4c22bd45cf5aa6e408e02b3fc1bff690&user=joanofarctan&format=json').text
data = json.load(data)
print type(data)
return data

thanks in advance, Lin

like image 325
Lin Ma Avatar asked Aug 16 '15 22:08

Lin Ma


2 Answers

This error raised because the data is a unicode/str variable, change the second line of your code to resolve your error:

data = json.loads(data)

json.load get a file object in first parameter position and call the read method of this.

Also you can call the json method of the response to fetch data directly:

response = requests.get('http://ws.audioscrobbler.com/2.0/?method=library.getartists&api_key=4c22bd45cf5aa6e408e02b3fc1bff690&user=joanofarctan&format=json')
data = response.json()
like image 77
M.javid Avatar answered Oct 12 '22 10:10

M.javid


requests.get(…).text returns the content as a single (unicode) string. The json.load() function however requires a file-like argument.

The solution is rather simple: Just use loads instead of load:

data = json.loads(data)

An even better solution though is to simply call json() on the response object directly. So don’t use .text but .json():

data = requests.get(…).json()

While this uses json.loads itself internally, it hides that implementation detail, so you can just focus on getting the JSON response.

like image 43
poke Avatar answered Oct 12 '22 10:10

poke