web-dev-qa-db-fra.com

SyntaxError: Caractère non-ASCII '\ xa3' dans le fichier lorsque la fonction renvoie '£'

Disons que j'ai une fonction:

def NewFunction():
    return '£'

Je veux imprimer des trucs avec un signe dièse devant et il affiche une erreur lorsque j'essaie d'exécuter ce programme, ce message d'erreur s'affiche:

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

Quelqu'un peut-il me dire comment inclure un signe dièse dans ma fonction de retour? Je l’utilise essentiellement dans une classe et c’est dans la partie '__str__' que le signe dièse est inclus.

257
SNIFFER_dog

Je vous recommande de lire ce PEP que l'erreur vous donne. Le problème est que votre code tente d'utiliser le codage ASCII, mais le symbole dièse n'est pas un caractère ASCII. Essayez d’utiliser le codage UTF-8. Vous pouvez commencer par placer # -*- coding: utf-8 -*- en haut de votre fichier .py. Pour aller plus loin, vous pouvez également définir des codages chaîne par chaîne dans votre code. Toutefois, si vous essayez d'insérer le littéral de signe dièse dans votre code, vous aurez besoin d'un codage qui le prend en charge pour l'ensemble du fichier.

350
Silas Ray

L'ajout des deux lignes suivantes a permis au haut de mon script .py de fonctionner pour moi (la première ligne était nécessaire):

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

Commencez par ajouter la ligne # -*- coding: utf-8 -*- au début du fichier, puis utilisez u'foo' pour toutes vos données unicode non-ASCII:

def NewFunction():
    return u'£'

ou utilisez la magie disponible depuis Python 2.6 pour le rendre automatique:

from __future__ import unicode_literals
55
plaes

Le message d'erreur vous dit exactement ce qui ne va pas. L’interprète Python doit connaître l’encodage du caractère non-ASCII.

Si vous voulez retourner + 00A alors vous pouvez dire

return u'\u00a3'

qui représente ce caractère en pure ASCII au moyen d'une séquence d'échappement Unicode. Si vous voulez renvoyer une chaîne d'octets contenant l'octet littéral 0xA3, c'est

return b'\xa3'

(où dans Python 2 la b est implicite; mais explicite vaut mieux qu'implicite).

Le PEP lié dans le message d'erreur vous indique exactement comment dire Python "ce fichier n'est pas du pur ASCII; voici l'encodage I utilise ". Si le codage est UTF-8, ce serait

# coding=utf-8

ou le compatible Emacs

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

Si vous ne savez pas quel codage votre éditeur utilise pour enregistrer ce fichier, examinez-le avec un éditeur de type hexadécimal et googler. Le dépassement de pile codage de caractères a une balise page d'informations sur les balises avec plus d'informations et des conseils de dépannage.

Autrement dit, en dehors de la plage ASCII (0x00-0x7F) à 7 bits, Python ne peut ni ne doit deviner quelle chaîne une séquence d'octets représente. https://tripleee.github.io/8bit#a montre 21 interprétations possibles pour l'octet 0xA3 et uniquement à partir des anciens codages à 8 bits; mais il pourrait aussi très bien s'agir du premier octet d'un codage sur plusieurs octets. Mais en fait, je suppose que vous utilisez réellement Latin-1, vous devriez donc avoir

# coding: latin-1

en tant que première ou deuxième ligne de votre fichier source. Quoi qu'il en soit, sans la connaissance du caractère que l'octet est censé représenter, un humain ne pourrait pas le deviner non plus.

10
tripleee

Vous essayez probablement de lancer le fichier Python 3 avec un interpréteur Python 2. Actuellement (à compter de 2019), la commande python par défaut est Python 2 lorsque les deux versions sont installées, sous Windows et dans la plupart des distributions Linux.

Mais si vous travaillez effectivement sur un script Python 2, une solution non encore mentionnée sur cette page consiste à réenregistrer le fichier en codage UTF-8 + BOM, ce qui ajoutera trois octets spéciaux au début. du fichier, ils informeront explicitement l'interprète Python (et votre éditeur de texte) du codage du fichier.

0
user