AttributeError (“ 'str'객체에는 'read'속성이 없습니다. ')


134

파이썬에서 오류가 발생합니다.

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

주어진 파이썬 코드 :

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

13
유래의 사회자처럼 보인다 ... 변화를, 유머 감각이
wildcard이다 페르난데스

6
2019 그리고 이것은 여전히 ​​우스운 : P
Rishav

1
실제로, 내 하루를 만들어, 미래에서 감사합니다 :)
Pesche Helfer

답변:


187

문제는 함수가 정의 된 json.load객체와 같은 파일을 전달해야한다는 것 read입니다. 그러니 당신이 사용 json.load(response)하거나 json.loads(response.read()).


3
이해가 안됩니다 ... read ()를 수행하면 문제가 어떻게 해결됩니까? 응답에 여전히 읽기 기능이 없습니다. 우리는 읽기 기능을 가진 어떤 객체에 문자열을 넣어야합니까?
zakdances

85
@ yourfriendzak 자세히 읽으면 매우 비슷한 이름을 가진 두 가지 기능이 있습니다. 메소드 json.load()와 함께 객체와 같은 파일을 가져오고 문자열을 가져옵니다. 끝에 "s"를 놓치기 쉽고 그것들이 같은 방법이라고 생각합니다. read()json.loads()
Joshmaker

4
Joshmaker의 의견 덕분에 json.loads ()는 JSON 데이터의 문자열을 구문 분석 할 수 있습니다!
Yu Shen

2
@ yourfriendzak이 답변 은 당신과 함께 open할 수 있음을 알려줍니다.
chaim

1
@MANISHZOPE s"문자열" 의 약자. 표준 라이브러리에 이름을 지정하는 방법과 관련하여 심각한 문제가 있음에 동의하며 이것이 엉망이되는 방법에 대한 좋은 예입니다.
Karl Knechtel

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하며이를 수행 할 수 있도록 직접 제공해야합니다 .

함수에 대한 내장 Python 문서 (try help(json.load)또는 전체 모듈 (try help(json))) 를 읽 거나 http://docs.python.org 에서 해당 함수에 대한 문서를 확인하여 이를 파악할 수도 있습니다 .


그것이 OP가 부르는 것입니다. 나는 항상 다른 사람들을 도울 때 그러한 식별자 이름을 변경하거나 유지할지에 대해 울타리에 있습니다. : /
Karl Knechtel

오, 당신이 바로, 내가 불평하지 않은 ... 그것을 미끄러 져 적이있어하지만 :)
안드레아 Ligios

12

다음과 같은 파이썬 오류가 발생하는 경우 :

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

객체를 문자열로 덮어 써서 실수로 객체를 독살했을 수 있습니다.

몇 줄의 코드로 파이썬 에서이 오류를 재현하는 방법 :

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

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

다음을 인쇄하십시오.

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

그러나 variablename의 이름을 변경하면 정상적으로 작동합니다.

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

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

이 오류는 문자열 내에서 메소드를 실행하려고 할 때 발생합니다. 문자열에는 몇 가지 메소드가 있지만 호출하는 메소드는 없습니다. 따라서 String이 정의하지 않은 메소드를 호출하지 말고 객체를 중독시킨 곳을 찾으십시오.


7

좋아, 이것은 오래된 실이지만. 나는 같은 문제를 겪었다. 나의 문제는 json.load대신에 사용 되었다.json.loads

이런 식으로 json은 모든 종류의 사전을로드하는 데 아무런 문제가 없습니다.

공식 문서

json.load-이 변환 표를 사용하여 fp (.read () 지원 텍스트 파일 또는 JSON 문서를 포함하는 이진 파일)를 Python 객체로 직렬화 해제합니다.

json.loads-이 변환 표를 사용하여 s (JSON 문서를 포함하는 str, bytes 또는 bytearray 인스턴스)를 Python 객체로 직렬화 해제합니다.


5

먼저 파일을 열어야합니다. 작동하지 않습니다.

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.