184

Python でエラーが発生します。

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

与えられた 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)
    jsonStr = response.read()
    
    return json.load(jsonStr)['data']['children']

このエラーは何を意味し、エラーを引き起こすために何をしたのですか?

4

6 に答える 6

246

問題は、関数が定義されjson.loadたファイルのようなオブジェクトを渡す必要があることです。readしたがって、json.load(response)またはを使用しますjson.loads(response.read())

于 2012-06-24T00:33:50.790 に答える
20

次のような python エラーが発生した場合:

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

オブジェクトを文字列で上書きして、誤ってオブジェクトを汚染した可能性があります。

数行のコードを使用して Python でこのエラーを再現する方法:

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

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

実行すると、次のように出力されます。

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

ただし、変数名の名前を変更すると、正常に機能します。

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

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

このエラーは、文字列内でメソッドを実行しようとしたときに発生します。String にはいくつかのメソッドがありますが、呼び出しているメソッドはありません。そのため、String が定義していないメソッドを呼び出そうとするのをやめて、オブジェクトを毒殺した場所を探し始めてください。

于 2014-10-29T19:51:44.813 に答える
17
AttributeError("'str' object has no attribute 'read'",)

これはまさにその言葉の意味です: 何か.readがあなたが与えたオブジェクトの属性を見つけようとし、あなたはそれにタイプのオブジェクトを与えましたstr(つまり、文字列を与えました)。

ここでエラーが発生しました:

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

readどこも探していないのでjson.load、呼び出した関数で発生する必要があります (完全なトレースバックで示されます)。これは、あなたが与えたものをjson.loadが試みているためですが、あなたはそれを与えました。これは現在、文字列に名前を付けています ( を呼び出して作成したものです)。.readjsonofabitch.readresponse

解決策: 自分自身に電話しないで.readください。response関数はこれを行い、そうできるように直接与えることを期待しています。

help(json.load)関数 ( try 、またはモジュール全体 ( try ) の組み込み Python ドキュメントを読むか、 http://docs.python.orghelp(json)でこれらの関数のドキュメントを確認することによって、これを理解することもできます。

于 2012-06-24T02:19:32.810 に答える