2017-10-09 3 views
1

this tutorial에서 'Earthquakes'예제를 따르려고합니다. 다음과 같이 코드는 다음과 같습니다matplotlib url에서 데이터 읽기 : TypeError : 'str'이 아닌 바이트와 같은 객체가 필요합니다.

import urllib 
from mpl_toolkits.basemap import Basemap 

# Significant earthquakes in the last 30 days 
url = urllib.request.urlopen("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_month.csv") 

# Reading and storage of data 
data = url.read() 
data = data.split(b'\n')[+1:-1] 

E = np.zeros(len(data), dtype=[('position', float, 2), 
           ('magnitude', float, 1)]) 

for i in range(len(data)): 
    row = data[i].split(',') 
    E['position'][i] = float(row[2]),float(row[1]) 
    E['magnitude'][i] = float(row[4]) 

나는 다음과 같은 오류 얻을 :

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-66-eed77a8fb64a> in <module>() 
    16 
    17 for i in range(len(data)): 
---> 18  row = data[i].split(',') 
    19  E['position'][i] = float(row[2]),float(row[1]) 
    20  E['magnitude'][i] = float(row[4]) 

TypeError: a bytes-like object is required, not 'str' 

내가 비슷한 질문을 인터넷 검색 및 지금까지 내가 이해, 그것은 파이썬 3 + 대신 2.7을 사용하여 함께 할 수있다 ,하지만 코드가 작동하도록 조정하는 방법을 알 수는 없었습니다. 죄송합니다. 질문이 벙어리라면, 내가해야 할 일을 이해하지 못합니다.

나는 다음과 같이하지만 아무 소용이 시도 :

if sys.version_info[0] == 3: 
    from urllib.request import urlopen 
else: 
    from urllib import urlopen 

with urlopen(url) as url: 
    data = url.read() 

답변

2

당신이 대신 b','','을 사용하는 split를 사용하려고하면. 요점은 bytesstrencode 또는 decode을 사용하여 명시 적으로 서로 변환해야하거나 항상 일관되게 사용해야한다는 것입니다.

+0

고맙습니다. 이제 작동합니다. 나는이 모든 것에 익숙하지 않으므로 실례합니다. 'b ',''를 사용하면 쉼표를 바이트로 변환합니까? 동일한 방법 (예 : URL에서 데이터를 읽을 때)을 얻기위한 다른 방법이 있습니까? –

+1

정확히 : 문자열 앞의'b '는'data = data.split (b'\ n ') [+ 1 : -1] 행에서와 비슷한 문자열을'bytes'로 해석합니다. '문자열 'b'에 대해 \ n ". 대안으로'url.read()'에서 얻은 데이터를'decode()'할 수 있습니다. 'data = url.read(). decode ('utf-8')'(또는 인코딩이 적절한 경우). https://docs.python.org/3.6/library/stdtypes.html?highlight=decode#bytes.decode를 참조하십시오. – norok2

관련 문제