2010-06-27 4 views
21

이 코드가 파이썬 2에서와 파이썬 3에서 작동하지 않는 이유를 알아 내려고 정말 피곤합니다. json 페이지를 잡고 구문 분석하려고합니다. 그것.파이썬 2 대 파이썬 3 - urllib 형식

import urllib, json 
response = urllib.urlopen("http://reddit.com/.json") 
content = response.read() 
data = json.loads(content) 

내가 파이썬 3에 해당하는 코드이 될 것 생각 : 여기 파이썬 2의 코드입니다

import urllib.request, json 
response = urllib.request.urlopen("http://reddit.com/.json") 
content = response.read() 
data = json.loads(content) 

는하지만, 내 얼굴에 불어 때문에 읽기에 의해 반환 된 데이터 ()는 "바이트"유형입니다. 그러나, 나는 json이 구문 분석 할 수있는 무언가로 변환 할 수 없다. 나는 레딧 나에게 다시 UTF-8을 보내려고 헤더 알고,하지만 난 바이트 UTF-8로 디코딩 얻을 수없는 것 : 내가 잘못 뭐하는 거지

import urllib.request, json 
response = urllib.request.urlopen("http://reddit.com/.json") 
content = response.read() 
data = json.loads(content.decode("utf8")) 

?

편집 : 문제는 데이터를 사용 가능한 상태로 만들 수 없다는 것입니다. json이 데이터를로드하더라도 그 중 일부는 표시 할 수 없으므로 데이터를 화면에 인쇄 할 수 있기를 원합니다.

두 번째 편집 : 문제는 구문 분석보다 인쇄와 관련이 있습니다. Alex의 대답은 IO를 utf8로 설정하여 스크립트가 Python 3에서 작동하는 방법을 제공합니다. 하지만 여전히 문제는 남아 있습니다. 코드가 Python 2에서 작동하지만 Python 3에서는 작동하지 않는 이유는 무엇입니까?

답변

15

두 버전 모두 분명히 잘못 되었기 때문에 게시 및 코드 작업이 잘못되었을 가능성이 있습니다 (f.read()f 베어 이름이 정의되지 않았기 때문에 실패합니다).

Py3에서는 json.loads(ur)과 마찬가지로 ur = response.decode('utf8')이 나를 위해 완벽하게 작동합니다. 어쩌면 잘못된 copys-and-pastes가 2 : 3 변환 시도에 영향을 미쳤을 수도 있습니다.

+0

코드 실수를 수정 해 드리겠습니다 ... 표시를 위해 다시 포맷하려했지만 모든 과정을 망쳤습니다. : P 데이터를 구문 분석 한 후에 (단순히 "인쇄 ​​(데이터)"를 사용하여) 데이터를 볼 수 없습니다. charmap 오류가 나기 때문에 데이터를 볼 수 없습니다. –

+0

@ 대니얼, 당신이 데이터를 얻은 이후의 문제는 데이터를 얻는 것에 관한이 질문과는 별개의 질문 인 것 같습니다. (제 대답은 반응을 보였습니다 - 당신이 동의하지 않았지만, 심지어 upvote 그것을!). 'data'에 의해'json.loads (response)'를 의미한다면, 문제없이 UTF-8을 지원하는 Mac Terminal.app에서'print '할 수 있습니다. sys.stdout.encoding이란 무엇입니까? 파이썬 3을 시작하기 전에 환경 변수'PYTHONIOENCODING : stdin/stdout/stderr'에 사용되는 인코딩 [: errors]을 올바르게 설정 했습니까? 등, 완전히 다른 문제는, 참조하십시오. –

+0

처음에 불분명하면 죄송합니다. 핵심 문제는 어떤 이유로 든 (파싱은 단지 시작일 뿐이지 만, 프린트 할 수 없다면 어딘가에 문제가 생길 것입니다. 데이터 읽기). 인코딩을 확인해보고 내 W7 시스템에서 작동하지 않는다고 말하면됩니다. –

0

that 다른 유니 코드 관련 질문에 대한 답변을 참조하십시오.

지금 : 파이썬 3 str (파이썬 2 unicode) 유형은 "바이트"가 아닌 "문자"를 다루는 이상적인 객체입니다. 이러한 문자는 디스크/네트워크 데이터에 사용하기 위해 a.k.a 코드 페이지 인 "변환 테이블"을 사용하여 바이트에서 인코딩/디코딩해야합니다. 운영체제의 다양성 때문에, 파이썬은 역사적으로 인코딩이 무엇인지 추측하지 않았습니다. 이것은 수년에 걸쳐 변화 해 왔지만, 여전히 "모호함에 직면하여 유혹을 거부합니다"라는 원칙이 적용됩니다.

다행히 웹 서버를 사용하면 작업이 더 쉬워집니다. (

>>> response.headers['content-type'] 
'application/json; charset=UTF-8' 

그래서 때마다 당신이 캐릭터 세트 값에 대한 Content-Type 헤더를 확인, 웹 서버에 요청을 발행하고, 유니 코드로 요청의 데이터를 디코딩 : 위 response 당신에게 필요한 모든 추가 정보를 제공한다 Python 3 : bytes.decode(charset)str)를 사용하십시오.

6

파이썬 버전에 따라 올바른 라이브러리를 선택해야합니다. 파이썬 2 파이썬 3.5

import urllib.request 
data = urllib.request.urlopen(url).read().decode('utf8') 

위한

.7

import urllib 
url = serviceurl + urllib.urlencode({'sensor':'false', 'address': address}) 
uh = urllib.urlopen(url) 
+0

코드를 명확하게 설명 할 수 있습니다. – GabrielOshiro