W Pythonie pojawia się błąd:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Podany kod Pythona:
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']
Co oznacza ten błąd i co zrobiłem, aby go wywołać?
python
python-2.7
urllib2
attributeerror
RobinJ
źródło
źródło
Odpowiedzi:
Problem polega na tym,
json.load
że powinieneś przekazać plik podobny do obiektu zeread
zdefiniowaną funkcją. Więc albo używaszjson.load(response)
albojson.loads(response.read())
.źródło
json.load()
pobiera plik jak obiekt zread()
metodą,json.loads()
pobiera ciąg. Łatwo przeoczyć „s” na końcu i pomyśleć, że to ta sama metoda.open
możesz to osiągnąć.s
oznacza „ciąg”. Zgadzam się, że biblioteka standardowa ma ogólnie poważne problemy z nazywaniem rzeczy i jest to dobry przykład tego, jak się zepsuła.AttributeError("'str' object has no attribute 'read'",)
Oznacza to dokładnie to, co jest napisane: coś próbowało znaleźć
.read
atrybut na obiekcie, który mu nadałeś, i nadałeś mu obiekt typustr
(tj. Nadałeś mu łańcuch).Wystąpił błąd tutaj:
json.load (jsonofabitch)['data']['children']
Cóż, nie szukasz
read
nigdzie, więc musi się to zdarzyć wjson.load
wywołanej funkcji (na co wskazuje pełne śledzenie). To dlatego, żejson.load
stara się.read
o rzeczy, które dał, ale dałeś gojsonofabitch
, co obecnie nazwy ciąg (który został utworzony przez wywołanie.read
naresponse
).Rozwiązanie: nie wzywaj
.read
siebie; funkcja zrobi to i oczekuje, że podasz jejresponse
bezpośrednio, aby mogła to zrobić.Mogłeś to również ustalić, czytając wbudowaną dokumentację Pythona dla funkcji (spróbuj
help(json.load)
lub dla całego modułu (tryhelp(json)
), lub sprawdzając dokumentację tych funkcji na http://docs.python.org .źródło
Jeśli pojawi się taki błąd Pythona:
AttributeError: 'str' object has no attribute 'some_method'
Prawdopodobnie przypadkowo zatrułeś obiekt, nadpisując go łańcuchem.
Jak odtworzyć ten błąd w Pythonie za pomocą kilku wierszy kodu:
#!/usr/bin/env python import json def foobar(json): msg = json.loads(json) foobar('{"batman": "yes"}')
Uruchom go, który drukuje:
AttributeError: 'str' object has no attribute 'loads'
Ale zmień nazwę nazwy zmiennej i działa dobrze:
#!/usr/bin/env python import json def foobar(jsonstring): msg = json.loads(jsonstring) foobar('{"batman": "yes"}')
Ten błąd jest spowodowany próbą uruchomienia metody w ciągu. String ma kilka metod, ale nie tę, którą wywołujesz. Więc przestań próbować wywołać metodę, której String nie definiuje i zacznij szukać, gdzie zatrułeś swój obiekt.
źródło
Ok, to stary wątek, ale. Miałem ten sam problem, mój problem został użyty
json.load
zamiastjson.loads
W ten sposób json nie ma problemu z ładowaniem dowolnego rodzaju słownika.
Oficjalna dokumentacja
źródło
Najpierw musisz otworzyć plik. To nie działa:
json_file = json.load('test.json')
Ale to działa:
f = open('test.json') json_file = json.load(f)
źródło