2017-10-09 11 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' 

が、私は同様の質問をGoogleで検索し、私の知る限り理解し、それは、Python 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を使用しようとします。要点は、bytesstrは、encodeまたはdecodeを使用して明示的に相互に変換する必要があるか、または常に一方または両方を使用する必要があります。

+0

本当にありがとうございます。私はこのすべてに非常に慣れていないので、私を許してください。 'b '、' 'を使うとそのコンマをバイトに変換しますか?同じ(つまり、URLからデータを読み込むとき)を実現する別の方法はありますか? –

+1

正確には、 'data = data.split(b '\ n')[+ 1:-1]の行のように、文字列の前に' b'が文字列を ' 'の文字列' 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

関連する問題