2017-10-09 66 views
1

我试图从this tutorial开始关注“地震”示例。代码如下: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

当您尝试使用split您使用','代替b','。关键是bytesstr需要使用encodedecode明确地互相转换,或者您必须始终如一地使用其中一个。

+0

非常感谢你,它现在的作品。我很不熟悉这一切,所以请原谅。是否使用'b',''将该逗号转换为字节?有没有其他的方法来实现(即从url读取数据时)? –

+1

准确地说:字符串前面的'b'装饰字符串以解释一个'bytes',类似于你在行data = data.split(b'\ n')[+ 1:-1] '为字符串'b'\ n''。或者,你可以'decode()'从'url.read()'得到的数据,例如'data = url.read()。decode('utf-8')'(或者whaterver编码是合适的)。另请参阅https://docs.python.org/3.6/library/stdtypes.html?highlight=decode#bytes.decode。 – norok2

相关问题