PDA

View Full Version : [Python 3, numpy] Errore Could not convert string


David_jcd
05-02-2015, 19:27
Ciao!
Sono nuovo di python e sto provando a fare questa esercitazione:

https://github.com/FredericBourgeon/python-exercises/blob/master/Data%20statistics/data-statistics-1.py

dove il file populations.txt è disponiible qui (https://github.com/FredericBourgeon/python-exercises/blob/master/Data%20statistics/populations.txt).

In verità mi blocco subito perchè, anche copiando paro paro il codice, quando cerco di caricare il file txt ottengo un messaggio di errore come questo:

pop = np.loadtxt('populations.txt')
Traceback (most recent call last):

File "<ipython-input-53-fda311d8f35c>", line 1, in <module>
pop = np.loadtxt('populations.txt')

File "C:\Users\David\Anaconda3\lib\site-packages\numpy\lib\npyio.py", line 856, in loadtxt
items = [conv(val) for (conv, val) in zip(converters, vals)]

File "C:\Users\David\Anaconda3\lib\site-packages\numpy\lib\npyio.py", line 856, in <listcomp>
items = [conv(val) for (conv, val) in zip(converters, vals)]

ValueError: could not convert string to float: b'\xef\xbb\xbf1900'


Qualcuno saprebbe aiutarmi?

P.S.:con genfromtxt funziona

cdimauro
05-02-2015, 19:52
Il problema è che quel file di testo è stato salvato in formato UTF-8 per Windows, per cui riporta il famigerato simbolo BOM (i primi 3 byte sono b'\xef\xbb\xbf' per l'appunto).

Aprilo con un editor che è in grado di eliminare quel simbolo, o comunque consento di rimuoverlo, poi salvalo e riprova.

ingframin
05-02-2015, 21:07
Il problema è che quel file di testo è stato salvato in formato UTF-8 per Windows, per cui riporta il famigerato simbolo BOM (i primi 3 byte sono b'\xef\xbb\xbf' per l'appunto).

Aprilo con un editor che è in grado di eliminare quel simbolo, o comunque consento di rimuoverlo, poi salvalo e riprova.
Oppure skippali quando leggi il file:
f = open('xxx.txt')
rd = f.read()[3:]
f.close()

E in rd hai il file senza i primi 3 bytes :)

cdimauro
06-02-2015, 05:30
Python rulez. :p

David_jcd
06-02-2015, 08:10
Grazie, provo e poi vi faccio sapere. Con notepad++ non riesco a rimuoverlo.

ingframin
06-02-2015, 14:50
Grazie, provo e poi vi faccio sapere. Con notepad++ non riesco a rimuoverlo.

Mi sono andato a leggere il codice dell'esercizio.
Lui usa una funzione di numpy per leggere il file, quindi per usare il mio sistema devi usare un piccolo trucco.
Metti nel codice questa funzione

def convert(filename):
f = open(filename,'rb')
rd = f.read()
f.close()
if b'\xef\xbb\xbf' in rd:
rd = rd.replace(b'\xef\xbb\xbf',"")
f2 = open('cnv_'+filename,'wb')
f2.write(rd)
return 'cnv_'+filename


e poi metti al posto di np.loadtxt('population.txt')
np.loadtxt(convert('population.txt'))

Dovrebbe funzionare ma fai attenzione perché python usa unicode in modo sconsiderato (uno dei tanti scombinamenti di versione tra 2 e 3, mannaggia a loro...) quindi se non funziona fammi sapere e proviamo a cambiarlo usando struct.unpack e roba simile...