Dalam Python saya mendapatkan kesalahan:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Diberi kode 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']
Apa arti kesalahan ini dan apa yang saya lakukan untuk menyebabkannya?
python
python-2.7
urllib2
attributeerror
RobinJ
sumber
sumber
jsonofabitch
nama variabel.Jawaban:
Masalahnya adalah bahwa
json.load
Anda harus meneruskan file seperti objek denganread
fungsi yang ditentukan. Jadi apakah Anda menggunakanjson.load(response)
ataujson.loads(response.read())
.sumber
json.load()
mengambil file seperti objek denganread()
metode,json.loads()
mengambil string. Sangat mudah untuk melewatkan "s" di akhir dan berpikir mereka adalah metode yang sama.open
Anda dapat mencapainya.s
singkatan dari "string". Saya setuju bahwa perpustakaan standar memiliki beberapa masalah serius secara keseluruhan dengan bagaimana hal-hal itu dinamai, dan ini adalah contoh yang baik tentang bagaimana itu menjadi kacau.Ini berarti persis seperti yang dikatakannya: sesuatu mencoba menemukan
.read
atribut pada objek yang Anda berikan, dan Anda memberinya objek tipestr
(yaitu, Anda memberinya string).Kesalahan terjadi di sini:
Nah, Anda tidak mencari di
read
mana pun, jadi itu harus terjadi padajson.load
fungsi yang Anda panggil (seperti yang ditunjukkan oleh traceback penuh). Itu karenajson.load
sedang mencoba.read
hal yang Anda berikan, tetapi Anda memberikannyajsonofabitch
, yang saat ini menamai string (yang Anda buat dengan memanggil.read
padaresponse
).Solusi: jangan menyebut
.read
diri Anda; fungsi akan melakukan ini, dan mengharapkan Anda untuk memberikannya secararesponse
langsung sehingga dapat melakukannya.Anda juga bisa mengetahuinya dengan membaca dokumentasi Python bawaan untuk fungsi (coba
help(json.load)
, atau untuk seluruh modul (cobahelp(json)
), atau dengan memeriksa dokumentasi untuk fungsi-fungsi tersebut di http://docs.python.org .sumber
Jika Anda mendapatkan kesalahan python seperti ini:
Anda mungkin meracuni objek Anda secara tidak sengaja dengan menimpa objek Anda dengan tali.
Cara mereproduksi kesalahan ini dalam python dengan beberapa baris kode:
Jalankan, yang mencetak:
Tetapi ubah nama variablename, dan itu berfungsi dengan baik:
Kesalahan ini disebabkan ketika Anda mencoba menjalankan metode dalam string. String memiliki beberapa metode, tetapi bukan metode yang Anda gunakan. Jadi berhentilah mencoba memanggil metode yang tidak didefinisikan oleh String dan mulailah mencari tempat Anda meracuni objek Anda.
sumber
Ok, ini utas lama tapi. Saya memiliki masalah yang sama, masalah saya yang saya gunakan
json.load
bukanjson.loads
Dengan cara ini, json tidak memiliki masalah dengan memuat kamus apa pun.
Dokumentasi resmi
sumber
Anda harus membuka file terlebih dahulu. Ini tidak berfungsi:
Tapi ini berhasil:
sumber