SintassiErrore: carattere non ASCII '\ xa3' nel file quando la funzione restituisce '£'


284

Di 'che ho una funzione:

def NewFunction():
    return '£'

Voglio stampare alcune cose con un cancelletto davanti e stampa un errore quando provo a eseguire questo programma, viene visualizzato questo messaggio di errore:

SyntaxError: Non-ASCII character '\xa3' in file 'blah' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details

Qualcuno può informarmi come posso includere un cancelletto nella mia funzione di ritorno? In pratica lo sto usando in una classe ed è all'interno della '__str__'parte che è incluso il cancelletto.


43
Hai mai letto il PEP a cui ti sei collegato? Descrive qual è il problema e come risolverlo.
murgatroid99,

2
"Qualcuno può informarmi come posso includere un cancelletto nella mia funzione di ritorno." Bene, il messaggio di errore dice "vedi python.org/peps/pep-0263.html per i dettagli"; forse dovresti iniziare da lì?
Karl Knechtel,

5
@ murgatroid99 Ecco cosa mancano tu e al momento in cui scrivo questi 27 altri: Sì, certo, leggerò il PEP. Livello di difficoltà: ho provato a eseguire / bin / sh contro un container docker. Non sto apertamente cercando di eseguire Python. Quindi tutto ciò che il PEP mi dirà è come riparare il codice Python che non sto cercando di eseguire e che non ho scritto. Speravo in un altro contesto da StackOverflow, invece ho ottenuto compiacenza. :( Ulteriori ricerche hanno rivelato la risposta effettiva: stackoverflow.com/questions/38992850/… - nota come il PEP ha fatto esattamente zero per aiutare.
Mark Allen

@MarkAllen - nella tua risposta collegata, il messaggio di errore indica che Python sta cercando di interpretare "/ bin / bash" - è certamente qualcosa di facile da trascurare, ma nulla in questa domanda indica che ha a che fare con la finestra mobile o un contenitore, quindi il consiglio qui come hai trovato non si applica al tuo problema - non è compiacimento, è solo che c'è un contesto nel tuo problema, che non è presente qui.
tanantesco

@tanantish Sono fedele a quello che ho detto. Ho ricevuto l'errore nella domanda. Invece di fornire informazioni utili alle persone con cui è stato incontrato, "Hai mai letto il PEP a cui ti sei collegato?" e "Bene, il messaggio di errore dice vedi (blah), prima o poi dovresti iniziare da lì?" <- Queste risposte non sono utili. Non sono sicuro del motivo per cui stiamo discutendo.
Mark Allen

Risposte:


368

Consiglio di leggere quel PEP che ti dà l'errore. Il problema è che il codice sta tentando di utilizzare la codifica ASCII, ma il simbolo della sterlina non è un carattere ASCII. Prova a utilizzare la codifica UTF-8. Puoi iniziare mettendo # -*- coding: utf-8 -*-nella parte superiore del tuo file .py. Per essere più avanzato, puoi anche definire codifiche su una stringa per stringa nel tuo codice. Tuttavia, se stai cercando di inserire letteralmente il segno della sterlina nel tuo codice, avrai bisogno di una codifica che lo supporti per l'intero file.


306

Aggiungendo le seguenti due righe, la parte superiore del mio script .py funzionava per me (la prima riga era necessaria):

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

Ho avuto lo stesso problema e il mio Python è 2.7.11. Dopo aver aggiunto la seconda riga # -*- coding: utf-8 -*-all'inizio del file, ha risolto il problema.
hailong,

2
La prima riga è rendere il file py eseguibile su * nix. Non è realmente correlato a questa domanda.
cmd

57

Prima aggiungi la # -*- coding: utf-8 -*-riga all'inizio del file e poi usa u'foo'per tutti i tuoi dati unicode non ASCII:

def NewFunction():
    return u'£'

o usa la magia disponibile da Python 2.6 per renderla automatica:

from __future__ import unicode_literals

12
Se hai # -*- coding: utf-8 -*-, non è necessario aggiungere il prefisso alle stringhe unicodeu
Daniel Lee,

@ spiega cosa succede se si trova su una variabile? esempio leggendo un file? Non posso usare uVariable, come lo faccio?
Skizo-ozᴉʞS

1
@DanielLee Tranne questo non è vero. # -*- coding: utf-8 -*-seguito da print 'błąd'produrrà immondizia, mentre print u'błąd'funziona.
Przemek D,

@DanielLee Cosa ha detto Przemek D. Mettere letterali UTF-8 nel tuo codice sorgente in questo modo non è generalmente una buona idea e può portare a comportamenti indesiderati, specialmente in Python 2. Se i letterali non sono ASCII 7 bit puri dovrebbero essere effettivi Unicode, non UTF-8, quindi in Python 2 dovresti mettere il uprefisso su tali letterali. In Python 3, le stringhe semplici sono comunque Unicode, ma il uprefisso è consentito nelle ultime versioni di Python 3 per rendere un po 'più semplice la scrittura di codice che si comporta correttamente in entrambi Python 2 e 3.
PM 2Ring

12

Il messaggio di errore indica esattamente cosa non va. L'interprete Python deve conoscere la codifica del carattere non ASCII.

Se vuoi restituire U + 00A3 , puoi dirlo

return u'\u00a3'

che rappresenta questo personaggio in puro ASCII mediante una sequenza di escape Unicode. Se vuoi restituire una stringa di byte contenente il byte letterale 0xA3, questo è

return b'\xa3'

(dove in Python 2 bè implicito; ma esplicito è meglio di implicito).

Il PEP collegato nel messaggio di errore indica esattamente come dire a Python "questo file non è puro ASCII; ecco la codifica che sto usando". Se la codifica è UTF-8, sarebbe

# coding=utf-8

o compatibile con Emacs

# -*- encoding: utf-8 -*-

Se non sai quale codifica viene utilizzata dal tuo editor per salvare questo file, esaminalo con qualcosa come un editor esadecimale e qualche googling. Stack Overflowtag ha una pagina di informazioni tag con ulteriori informazioni e alcuni suggerimenti per la risoluzione dei problemi.

In così tante parole, al di fuori dell'intervallo ASCII a 7 bit (0x00-0x7F), Python non può e non deve indovinare quale stringa rappresenta una sequenza di byte. https://tripleee.github.io/8bit#a3 mostra 21 possibili interpretazioni per il byte 0xA3 e questo è solo dalle codifiche legacy a 8 bit; ma potrebbe anche essere il primo byte di una codifica multi-byte. Ma in effetti, immagino che tu stia effettivamente usando Latin-1, quindi dovresti

# coding: latin-1

come prima o seconda riga del file sorgente. Ad ogni modo, senza la conoscenza di quale personaggio dovrebbe rappresentare il byte, neanche un essere umano potrebbe indovinarlo.

Un avvertimento: coding: latin-1rimuoverà sicuramente il messaggio di errore (perché non ci sono sequenze di byte che non sono tecnicamente consentite in questa codifica), ma potrebbe produrre un risultato completamente sbagliato quando il codice viene interpretato se la codifica effettiva è qualcos'altro. Devi davvero conoscere la codifica del file con assoluta certezza quando dichiari la codifica.


Questo è un adattamento di una precedente risposta di miniera per una domanda duplicato: stackoverflow.com/a/50829958/874188
tripleee

Python 3 utilizza per impostazione predefinita UTF-8 per i file di origine e probabilmente dovresti comunque utilizzare UTF-8 per tutto in questi giorni. utf8everywhere.org
tripleee il

8

L'aggiunta delle seguenti due righe nello script ha risolto il problema per me.

# !/usr/bin/python
# coding=utf-8

Spero che sia d'aiuto !


2

Probabilmente stai cercando di eseguire il file Python 3 con l'interprete Python 2. Attualmente (dal 2019), il pythoncomando predefinito è Python 2 quando sono installate entrambe le versioni, su Windows e sulla maggior parte delle distribuzioni Linux.

Ma nel caso in cui tu stia effettivamente lavorando su uno script Python 2, una soluzione non ancora menzionata in questa pagina è quella di salvare nuovamente il file con codifica UTF-8 + BOM, che aggiungerà tre byte speciali all'inizio del file, informare esplicitamente l'interprete Python (e il tuo editor di testo) sulla codifica dei file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.