No Python, estou recebendo um erro:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Dado código python:
def getEntries (self, sub):
url = 'http://www.reddit.com/'
if (sub != ''):
url += 'r/' + sub
request = urllib2.Request (url +
'.json', None, {'User-Agent' : 'Reddit desktop client by /user/RobinJ1995/'})
response = urllib2.urlopen (request)
jsonofabitch = response.read ()
return json.load (jsonofabitch)['data']['children']
O que esse erro significa e o que eu fiz para causá-lo?
python
python-2.7
urllib2
attributeerror
RobinJ
fonte
fonte
jsonofabitch
nome da variávelRespostas:
O problema é que, para
json.load
você, deve passar um arquivo como objeto com umaread
função definida. Então você usajson.load(response)
oujson.loads(response.read())
.fonte
json.load()
pega um arquivo como objeto com umread()
método,json.loads()
pega uma string. É fácil perder os "s" no final e pensar que eles são o mesmo método.open
você pode conseguir isso.s
significa "string". Concordo que a biblioteca padrão tem alguns problemas sérios no geral com a maneira como as coisas são nomeadas, e este é um bom exemplo de como é confuso.Isso significa exatamente o que diz: algo tentou encontrar um
.read
atributo no objeto que você deu e um objeto do tipostr
(ou seja, você deu uma string).O erro ocorreu aqui:
Bem, você não está procurando
read
nenhum lugar, portanto, isso deve acontecer najson.load
função que você chamou (como indicado pelo rastreamento completo). Isso é porquejson.load
está tentando.read
a coisa que você deu, mas você deujsonofabitch
, que atualmente nomeia uma string (que você criou chamando.read
noresponse
).Solução: não chame
.read
a si mesmo; a função fará isso e espera que você dê oresponse
diretamente para que ele possa fazê-lo.Você também pode ter descoberto isso lendo a documentação interna do Python para a função (try
help(json.load)
ou para todo o módulo (tryhelp(json)
)) ou verificando a documentação dessas funções em http://docs.python.org .fonte
Se você receber um erro python como este:
Você provavelmente envenenou seu objeto acidentalmente substituindo-o por uma string.
Como reproduzir esse erro em python com algumas linhas de código:
Execute-o, que imprime:
Mas mude o nome do nome da variável e ele funciona bem:
Este erro é causado quando você tenta executar um método dentro de uma string. String possui alguns métodos, mas não o que você está chamando. Portanto, pare de tentar invocar um método que String não define e comece a procurar onde você envenenou seu objeto.
fonte
Ok, este é um tópico antigo, mas. Eu tive um mesmo problema, meu problema foi usar em
json.load
vez dejson.loads
Dessa forma, o json não tem nenhum problema em carregar qualquer tipo de dicionário.
Documentação oficial
fonte
Você precisa abrir o arquivo primeiro. Isso não funciona:
Mas isso funciona:
fonte