2017-10-09 6 views
1

J'essaie de suivre l'exemple 'Tremblements de terre' de this tutorial. Le code est le suivant:matplotlib lire les données de l'url: TypeError: un objet de type octets est requis, pas '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]) 

Je reçois l'erreur suivante:

--------------------------------------------------------------------------- 
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' 

Je googlé des questions similaires et pour autant que je comprends, il doit faire avec l'aide de Python 3. + au lieu de 2,7 , mais je ne pouvais pas comprendre comment ajuster le code pour que cela fonctionne. Désolé si la question est bête, je ne comprends pas ce que je dois faire.

J'ai essayé avec les éléments suivants, mais sans succès:

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

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

Répondre

2

Lorsque vous essayez d'utiliser split vous utilisez ',' au lieu de b','. Le point est que bytes et str doivent être explicitement convertis les uns aux autres en utilisant encode ou decode, ou vous devez utiliser de manière cohérente l'un ou l'autre.

+0

Merci beaucoup, ça marche maintenant. Je ne suis pas familier avec tout cela, veuillez m'excuser. Est-ce que l'utilisation de 'b ','' convertit cette virgule en octets? Existe-t-il une autre façon d'obtenir la même chose (c'est-à-dire en lisant les données de l'URL)? –

+1

Exactement: 'b' devant les chaînes décore la chaîne à interpréter un' bytes', de manière similaire à ce que vous faites dans la ligne 'data = data.split (b '\ n') [+ 1: -1] 'pour la chaîne' b '\ n''. Comme alternative, vous pouvez 'decoder()' les données que vous obtenez de 'url.read()', par ex. 'data = url.read(). decode ('utf-8')' (ou le codage whaterver est approprié). Voir aussi https://docs.python.org/3.6/library/stdtypes.html?highlight=decode#bytes.decode. – norok2