[risolto] UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe9 in position 0: ordinal not in range(128)

Questo genere di errore avviene in Python quando si cercano di convertire le stringhe da Unicode (UTF-8) in ASCII. Questo avviene più spesso di quanto non si creda, dal momento che le stringhe di testo sono tutte gestite come ASCII e il meccanismo che si occupa della conversione, paradossalmente, può gestire unicamente caratteri ASCII.

Per un approfondimento tecnico consiglio la lettura di questo articolo: Overcoming frustration: Correctly using unicode in python2

In questo caso voglio trattare l’esempio di errore che si ha utilizzando il seguente codice:

L’errore restituito è il seguente:

Traceback (most recent call last):
File "C:\Users\utente\Desktop\esempio\errore.py", line 4, in <module>
print ";".join(prova)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

In particolare il problema si presenta quando si tenta di fare la join sulla lista con un separatore di testo.

Online si trovano numerose soluzioni come per esempio questa (che però non funziona!), ma nessuna che mi abbia davvero soddisfatto:

Il problema di fondo è che le stringhe incriminate, che nel mio esempio ho scritto io, sono lette dal programma da sorgenti esterne sulle quali non ho controllo e fare il debugging di tutti i possibili caratteri (milioni di caratteri come minimo!) è chiaramente alquanto improbabile.

Per aggirare il sistema e poter effettuare comunque la join ho usato quindi una funzione costruita ad hoc nel modo seguente:

A questo punto possiamo testarla nel modo seguente:

Il risultato stampato è il seguente:

é;a;è;;;èòà+;pippo  prova;;ancora

Faccio notare come in questo modo vengano ignorati i caratteri incriminati. Non è una soluzione molto elegante, ma comunque si raggiunge lo scopo di poter “pulire” il testo di origine.

Questo errore potrebbe anche presentarsi in altre forme come:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xc2' in position 0: ordinal not in range(128)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 20: ordinal not in range(128)

E altri.

Vedi articolo

[python] Radiazione di Hawking e tempo che impiega un buco nero ad evaporare

In memoria di Stephen Hawking propongo un modesto esercizio in Python per calcolare il tempo di evaporazione di un buco nero, secondo la radiazione di Hawking.

In questo caso utilizzeremo le librerie scipy e numpy di Python.

Il mio esempio sarà fatto sotto Windows. Anzitutto installiamo quindi le librerie necessarie utilizzando pip, nella PowerShell digitiamo:

Una volta fatto avviamo un nuovo progetto in python e andiamo anzitutto a calcolare la suddetta formula. L’equazione di evaporazione di un buco nero, che si trovasse in una condizione ideale (ovvero nessuna aggiunta di energia, quindi ipoteticamente in un universo completamente vuoto e senza radiazione di fondo) è la seguente:

t_{ev} = \frac{5120 \pi G^2 M_0^3}{\hbar c^4}

Per scriverla in Python digitiamo:

Faccio notare che da scipy importiamo le costanti fisiche e matematiche che possiamo utilizzare secondo la seguente tabella.

M0 è l’ipotetica massa iniziale di un buco nero di massa solare, nello specifico di 1,98892 * 10^{30} kg .

Il risultato dovrebbe essere:

Il risultato è in secondi, possiamo convertirlo in miliardi di anni digitando:

Il risultato è qualcosa come 2 * 10^{58} miliardi di anni, molto più dell’attuale vita dell’universo stimata attorno ai 13 miliardi di anni.

Adesso proviamo ad inserire l’equazione in un grafico, dove vogliamo confrontare vari tipi di buco nero in base alla massa ed il tempo di evaporazione.

Per farlo anzitutto convertiamo la nostra precedente equazione in una funzione digitando:

Ricordiamoci che il risultato della funzione è in secondi. A questo punto prepariamo i valori del nostro asse x, che saranno le masse di diversi buchi neri. Prendiamo 100 valori tra 0 e 1030.

Sull’asse Y calcoliamo i corrispondenti valori:

Adesso impacchettiamo tutto in un grafico generato con matplotlib.

Il risultato sarà qualcosa di simile a questo:

Vedi articolo

Liberare spazio su Ubuntu con errore apt-get “No space left on device”

Problema: non sembra esserci spazio sufficiente sul disco per eseguire installazioni ed aggiornamenti con apt-get

Per risolvere il problema è sufficiente cancellare i vecchi linux-headers e linux-image del Kernel. Questi file si trovano in /usr/src/

Per verificare le versioni installate anzitutto controlliamo il contenuto della suddetta cartella con:

Dovremmo vedere un elenco di file chiamati linux-headers, linux-image, linux-image-extra ed altri. Per esempio potremmo trovare un elenco come il seguente:

Nel mio caso vedo che ho installate le versioni 3.13.0-132, 3.13.0-1333.13.0-1353.13.0-137 del kernel.

Questo significa che posso cancellare, a meno di non averne bisogno per specifici motivi (ma se non li conosco, probabilmente non ne ho bisogno) le versioni 132, 133 e 135. Devo lasciare invece la versione 137.

Dopo svariate prove sono giunto alla conclusione che per cancellare una determinata versione, senza lasciare fastidiosi rimasugli, è sufficiente digitare la seguente serie di istruzioni (immaginiamo di voler eliminare la versione 132):

Per chi volesse cancellare più versioni in un colpo solo, senza stare a perdere tempo a modificare i numeri nelle precedenti righe, ho creato un piccolo script per Python (io uso questo per fare pulizia sul disco) che mi genera i comandi da incollare sul terminale.

L’unico parametro da modificare è il primo vettore, aggiungendo o togliendo le versioni.

Durante l’esecuzione ci verrà chiesto se mantenere la configurazione di grub, possiamo dirgli di sì.

Vedi articolo

concurrent.futures.process.BrokenProcessPool eseguendo QuantumProgram di qiskit-sdk

Soluzione: il codice eseguito in Python deve essere protetto, o meglio “guarded”, ciò significa che il QuantumProgram deve essere eseguito dentro ad un’istruzione if __name__ == “__main__”

Compilando il programma nell’esempio nel qiskit-sdk-py si incorre nel seguente errore durante l’esecuzione:

Questo accade perché si tentano di avviare delle biforcazioni del processo originale senza aver utilizzato un idioma appropriato per il modulo. Per correggere il problema è sufficiente reimpostare il codice eseguibile in questo modo:

Ambiente di prova:

  • Version used: Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
  • Environment name and version (e.g. Python 3.6.1): Python 3.6.3
  • Operating System and version: Microsoft Windows 10 Pro 10.0.16299 build 16299

 

Pubblicato originariamente su Github.

Vedi articolo