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


133

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

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


187
jsonofabitch変数名が好きです。
Mon Calamari、

6
はは!その「jsonofabitch」とは何ですか?:D
Bahadir Tasdemir 2016年

13
Stackoverflowのモデレーターは、変化のためにユーモアのセンスを持っているようです...
Pepito Fernandez

6
2019年、これはまだおもしろい:P
リシャフ

1
確かに、私の日を作りました、未来からありがとう:)
ペシェ・ヘルファー

回答:


186

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


3
私はこれを理解していません... read()を実行するとどのように問題が解決されますか?応答にはまだ読み取り関数がありません。文字列を読み取り関数を使用してオブジェクトに配置することになっていますか?
ザクダンス2012

84
@yourfriendzakをよく読んでください。非常によく似た名前を持つ2つの異なる関数です。メソッドでjson.load()オブジェクトのようなファイルを受け取り、文字列を受け取ります。最後の "s"を見逃して、同じ方法だと思うのは簡単です。read()json.loads()
Joshmaker 2013

4
Joshmakerのコメントのおかげで、json.loads()はJSONデータの文字列を解析できます!
Yu Shen 2013年

2
@yourfriendzakこの答えは、あなたと一緒にopenそれを達成できることを示しています。
chaim 2014

1
@MANISHZOPEはs「文字列」の略です。標準ライブラリには、名前の付け方に関して全体的にいくつかの深刻な問題があることに同意します。これは、それがどのように混乱するかの良い例です。
Karl Knechtel、2016年

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

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

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

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

まあ、readどこも探しているわけではないので、json.load呼び出した関数内で発生する必要があります(完全なトレースバックで示されています)。だからであるjson.loadしようとしている.readあなたはそれを与えた事が、あなたはそれを与えjsonofabitch、現在どの名前(あなたが呼び出すことによって作成された文字列.readresponse)。

解決策:.read自分を呼ばないでください。関数はこれを実行し、responseそれを実行できるように直接指定することを期待しています。

また、関数help(json.load)(try help(json))、またはモジュール全体(try )の組み込みPythonドキュメントを読むか、http://docs.python.orgでそれらの関数のドキュメントをチェックして、これを理解することもできます


それはOPがそれを呼んだものです。私は、他の人を助けるときにそのような識別子名を変更するか保存するかについて常にフェンスの中にいます。:/
Karl Knechtel

ああ、そうです、私はそれを
すくい取り

12

次のような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が定義していないメソッドを呼び出そうとするのをやめて、オブジェクトを汚染した場所を探し始めます。


7

わかりました、これは古いスレッドですが。私は同じ問題を抱えていました、私の問題はjson.load代わりに使用されましたjson.loads

このように、jsonはどのような種類の辞書でも問題なくロードできます。

公式ドキュメント

json.load-この変換テーブルを使用して、fp(.read()対応のテキストファイルまたはJSONドキュメントを含むバイナリファイル)をPythonオブジェクトにデシリアライズします。

json.loads-この変換テーブルを使用して、s(JSONドキュメントを含むstr、bytesまたはbytearrayインスタンス)をPythonオブジェクトにデシリアライズします。


4

最初にファイルを開く必要があります。これは機能しません:

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

しかし、これはうまくいきます:

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

2
質問の要求応答の代わりにファイルを開こうとしたときに、質問にエラーが見つかりました。明らかに、バックエンドでは、jsonは両方を同様に扱っているため、この答えが役に立ちました。明らかに賛成票に値する。
Nitin Khanna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.