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']
このエラーは何を意味し、それを引き起こすために何をしましたか?
問題は、json.load
に対して、read
関数が定義されたオブジェクトのようなファイルを渡す必要があることです。したがって、 json.load(response)
または json.loads(response.read())
を使用します。
AttributeError("'str' object has no attribute 'read'",)
これはまさにそれが言っていることを意味します:あなたがそれを与えたオブジェクトの.read
属性を見つけようとし、タイプstr
name__のオブジェクトを与えました(つまり、あなたはそれに文字列を与えました)。
ここでエラーが発生しました:
json.load (jsonofabitch)['data']['children']
まあ、あなたはread
name__を探しているわけではないので、呼び出したjson.load
関数で発生しなければなりません(完全なトレースバックで示されるように)。これは、json.load
があなたが与えたものを.read
にしようとしているが、現在はjsonofabitch
name__で.read
を呼び出すことで作成した文字列に名前を付けているresponse
name__を与えたからです。
解決策:.read
を自分で呼び出さないでください。関数はこれを行います。そして、それができるようにresponse
name__を直接与えることを期待しています。
関数の組み込みPythonドキュメント(help(json.load)
を試す)、またはモジュール全体(help(json)
を試す)を読むか、または http://docs.python.org にあるこれらの関数のドキュメント。
このような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で定義されていないメソッドを呼び出そうとするのをやめて、オブジェクトをポイズニングした場所を探し始めます。