AttributeError ("'str' nesnesinin 'okuma' özniteliği yok)


134

Python'da bir hata alıyorum:

Exception:  (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)

Python kodu verildiğinde:

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']

Bu hata ne anlama geliyor ve buna neden olmak için ne yaptım?


191
jsonofabitchDeğişken adını severim .
Mon Calamari

6
Haha! Bu "jsonofabitch" nedir? : D
Bahadır Taşdemir

13
Görünüşe göre Stackoverflow moderatörlerinin bir mizah anlayışı var gibi görünüyor, bir değişiklik olsun ...
Pepito Fernandez

6
2019 ve bu hala komik: P
Rishav

1
Gerçekten, günümü yaptım, gelecekten teşekkür ederim :)
Pesche Helfer

Yanıtlar:


187

Sorun, json.loadsizin için readtanımlanmış bir işlevle dosya benzeri bir nesne iletmeniz gerektiğidir . Yani ya kullanırsın json.load(response)ya json.loads(response.read()).


3
Bunu anlamıyorum ... read () işlemi sorunu nasıl çözer? Yanıtın hala bir okuma işlevi yoktur. Dizeyi okuma işlevi olan bir nesneye mi koymamız gerekiyor?
zakdances

87
@yourfriendzak yakından okuyun, çok benzer adlara sahip iki farklı işlevdir. json.load()bir read()yöntemle nesne benzeri bir dosya json.loads()alır, bir dizge alır. Sonunda "s" yi gözden kaçırmak ve aynı yöntem olduklarını düşünmek kolaydır.
Joshmaker

4
Joshmaker'in yorumu sayesinde, json.loads () JSON verileri için dizeyi ayrıştırabilir!
Yu Shen

2
@yourfriendzak Bu cevapopen size bunu başarabileceğinize işaret edecektir .
chaim

1
@MANISHZOPE s"string" anlamına gelir. Standart kütüphanenin genel olarak nesnelerin nasıl adlandırıldığı ile ilgili bazı ciddi sorunları olduğunu kabul ediyorum ve bu, nasıl karıştığına dair iyi bir örnek.
Karl Knechtel

13
AttributeError("'str' object has no attribute 'read'",)

Bu, tam olarak söylediği anlamına gelir: bir şey .readona verdiğiniz nesnede bir öznitelik bulmaya çalıştı ve siz ona bir tür nesne strverdiniz (yani, ona bir dizge verdiniz).

Hata burada oluştu:

json.load (jsonofabitch)['data']['children']

Pekala, readherhangi bir yeri aramıyorsunuz , bu yüzden json.loadçağırdığınız işlevde gerçekleşmelidir (tam traceback ile belirtildiği gibi). Bunun sebebi json.loadçalışıyor .read, ona verdiğiniz o şeyin, ama bunu verdi jsonofabitch, şu anda hangi isimler (aradığınız tarafından oluşturulan bir dize .readüzerinde response).

Çözüm: .readKendinizi aramayın ; işlev bunu yapacak ve bunu yapabilmesi için ona responsedoğrudan vermenizi bekliyor .

Bunu, işlev için yerleşik Python belgelerini okuyarak (deneyin help(json.load)veya modülün tamamı için (deneyin help(json)) veya http://docs.python.org adresindeki bu işlevlerin belgelerine bakarak da çözebilirsiniz .


OP'nin adı buydu. Başkalarına yardım ederken bu tür tanımlayıcı adlarını değiştirip değiştirmeme konusunda her zaman kararsızım. : /
Karl Knechtel

Oh, haklısın, gözden geçirdim ... Şikayetçi
değildim

12

Bunun gibi bir python hatası alırsanız:

AttributeError: 'str' object has no attribute 'some_method'

Muhtemelen nesnenizin üzerine bir ip ile yazarak nesnenizi yanlışlıkla zehirlediniz.

Bu hatayı python'da birkaç satır kodla nasıl yeniden oluşturabilirsiniz:

#!/usr/bin/env python
import json
def foobar(json):
    msg = json.loads(json)

foobar('{"batman": "yes"}')

Çalıştırın, şunu yazdırır:

AttributeError: 'str' object has no attribute 'loads'

Ancak değişken adının adını değiştirin ve sorunsuz çalışıyor:

#!/usr/bin/env python
import json
def foobar(jsonstring):
    msg = json.loads(jsonstring)

foobar('{"batman": "yes"}')

Bu hata, bir dize içinde bir yöntemi çalıştırmayı denediğinizde ortaya çıkar. String'in birkaç yöntemi vardır, ancak sizin çağırdığınız yöntem yoktur. Bu nedenle, String'in tanımlamadığı bir yöntemi çağırmayı bırakın ve nesnenizi nerede zehirlediğinizi aramaya başlayın.


7

Tamam, bu eski bir konu ama. Aynı sorunu yaşadım, benim sorunum json.loadyerine kullandımjson.loads

Bu şekilde, json herhangi bir sözlüğü yüklemekte sorun yaşamaz.

Resmi belgeler

json.load - Bu dönüştürme tablosunu kullanarak fp'yi (a .read () - bir JSON belgesi içeren metin dosyasını veya ikili dosyayı destekleyen) bir Python nesnesine serisini kaldırın.

json.loads - Bu dönüştürme tablosunu kullanarak s (bir JSON belgesi içeren bir str, bayt veya bytearray örneğini) bir Python nesnesine serisini kaldırın.


5

Önce dosyayı açmanız gerekir. Bu çalışmıyor:

json_file = json.load('test.json')

Ancak bu işe yarar:

f = open('test.json')
json_file = json.load(f)

2
Sorudaki istek yanıtı yerine bir dosyayı açmaya çalışırken sorudaki hatayı buldum. Açıkça, arka uçta json her ikisine de benzer şekilde davranıyor ve bu nedenle bu cevap bana yardımcı oldu. Açıkça bir oylamaya değer.
Nitin Khanna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.