web-dev-qa-db-ja.com

AttributeError( "'str'オブジェクトには属性 'read'"がありません)

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)
    jsonofabitch = response.read ()

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

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

93
RobinJ

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

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

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

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

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

まあ、あなたはreadname__を探しているわけではないので、呼び出したjson.load関数で発生しなければなりません(完全なトレースバックで示されるように)。これは、json.loadがあなたが与えたものを.readにしようとしているが、現在はjsonofabitchname__で.readを呼び出すことで作成した文字列に名前を付けているresponsename__を与えたからです。

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

関数の組み込みPythonドキュメント(help(json.load)を試す)、またはモジュール全体(help(json)を試す)を読むか、または http://docs.python.org にあるこれらの関数のドキュメント。

12
Karl Knechtel

このような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で定義されていないメソッドを呼び出そうとするのをやめて、オブジェクトをポイズニングした場所を探し始めます。

8
Eric Leschinski