ubuntuusers.de

python: Non-ASCII character '\xc3' in file ...

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

Glocke

Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

Hi,

ich benutze Python 2.6.4 und habe folgenden Quellcode:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python

# Bibliotheken
import random

# --- init() ---------------------------------------------------------------------------------------
def init():
	okay = False
	seiten = 0
	while (okay == False):
		seiten = int(input("Wie viele Seiten hat der Würfel? "))
		if ((seiten == 4) or (seiten == 6) or (seiten == 8)
		or (seiten == 12) or (seiten == 20)):
			print "Okay"
			okay = True
		else:
			print "Schon mal einen W%s gesehen?" % (seiten)
	return seiten

# --- roll() ---------------------------------------------------------------------------------------
def roll(seiten):
	return random.randint(1, seiten)

# --- main() ---------------------------------------------------------------------------------------
def main():
	i = init()
	print roll(i)

main()

Beim Ausführen des Codes über die interaktive Konsole, tritt kein Fehler auf.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> #!/usr/bin/env python
... 
>>> # Bibliotheken
... import random
>>> 
>>> # --- init() ---------------------------------------------------------------------------------------
... def init():
...     okay = False
...     seiten = 0
...     while (okay == False):
...             seiten = int(input("Wie viele Seiten hat der Würfel? "))
...             if ((seiten == 4) or (seiten == 6) or (seiten == 8)
...             or (seiten == 12) or (seiten == 20)):
...                     print "Okay"
...                     okay = True
...             else:
...                     print "Schon mal einen W%s gesehen?" % (seiten)
...     return seiten
... 
>>> # --- roll() ---------------------------------------------------------------------------------------
... def roll(seiten):
...     return random.randint(1, seiten)
... 
>>> # --- main() ---------------------------------------------------------------------------------------
... def main():
...     i = init()
...     print roll(i)
... 
>>> main()
Wie viele Seiten hat der Würfel? 12
Okay
9
>>> 

Hier schon:

1
2
3
glocke@laptop:~/python/wuerfelspiel$ python main.py
  File "main.py", line 11
SyntaxError: Non-ASCII character '\xc3' in file main.py on line 11, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Selbst wenn ich die ganze Datei auskommentiere tritt der Fehler auf. Dabei wollte ich wissen woran es liegt. Ich kann in Zeile 11 nichts Non-ASCII finden ...

DasIch

Avatar von DasIch

Anmeldungsdatum:
2. November 2005

Beiträge: 1130

Dir ist klar das "ü" nicht in ASCII vorkommt?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2503

Das liegt daran, dass dein Python-Interpreter nicht weiß, dass du (vermutlich) als UTF-8 gespeichert hast – und weil du ein "ü" im Quellcode drin hast, knallt es. ☺

Geh doch mal auf die URL, die dort in der Exception angegeben ist. Eigentlich steht da alles. Auf kurze Sicht reicht dir aber wohl diese zweite Zeile im Code:

1
2
#!/usr/bin/env python
# coding: utf8

In der ersten oder zweiten Zeile kannst du so das Encoding der Datei angeben (überhaupt machen musst du das übrigens deshalb, weil sich das Encoding nicht immer definitiv automatisch erkennen lässt – ein Programm kann nur "gut raten"). Viele Leute benutzen an der Stelle eine Zeile, mit der auch Emacs etwas anfangen kann, was ich nie so wirklich verstanden habe – so geht es nämlich auch und ist einfacher zu tippen. ☺

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

DasIch schrieb:

Dir ist klar das "ü" nicht in ASCII vorkommt?

ööhm eigentlich ja, aber bis eben verdrängt... xD war mittlerweile alles so selbstverständlich xD

1
# coding: utf8

hat geholfen. danke

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4668

Wohnort: Berlin

@Glocke: Die Kommentare sind alle ein wenig sinnlos. Da steht keine Information drin, die nicht ziemlich offensichtlich auch im Quelltext steht.

init() sagt als Name nicht viel über den Inhalt der Funktion aus.

Klammern um Bedingungen sind unnötig und einen Wahrheitswert mit == oder != gegen einen literalen Wahrheitswert zu testen ist schlechter Stil. Das was Du da testest ist doch selbst schon ein Wahrheitswert und bei dem Vergleich kommt nur wieder einer heraus. Wenn man auf den "anderen" Wert testen möchte, sollte man den, den man hat, einfach negieren. Also while not okay:.

Allerdings würde ich mir das okay komplett sparen und einfach eine "Endlosschleife" schreiben, die im Erfolgsfall mit return verlassen wird.

seiten muss man vor der Schleife nicht an die 0 binden.

Von input() solltest Du bei Python 2.x Abstand nehmen. Das was der Benutzer da eingibt wird als Python-Ausdruck ausgewertet. Der könnte da also auch 2*3 eingeben. Entsprechend schwer ist es auch da auf Fehler zu reagieren, denn es kann so ziemlich alles passieren. Wenn man eine Zeichenkette haben möchte, verwendet man raw_input().

Die if-Bedingung lässt sich deutlich kürzer mit einer Liste der erlaubten Werte und dem in-Operator formulieren. Die Funktion könnte dann so aussehen:

1
2
3
4
5
6
7
def init():
    while True:
        seiten = int(raw_input('Wie viele Seiten hat der Würfel? '))
        if seiten in [4, 6, 8, 12, 20]:
            print 'Okay'
            return seiten
        print 'Schon mal einen W%s gesehen?' % seiten

Du solltest Dich übrigens mal für Englisch oder für Deutsch entscheiden. roll(seiten) liest sich IMHO fürchterlich. ☺

Den Aufruf der main()-Funktion schützt man üblicherweise mit folgendem Idiom vor der Ausführung wenn das Modul nur importiert statt als Programm ausgeführt wird:

1
2
if __name__ == '__main__':
    main()

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

hehe Kritik ☺ *willkommen*

ich hab sie mal zur kenntnis genommen. (danke ☺ )

aber was genau bringt mir das hier?

1
2
if __name__ == '__main__':
    main()

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4668

Wohnort: Berlin

@Glocke: Der Name __name__ ist in einem Modul immer an den Namen des Moduls gebunden, also in der Regel der Dateiname ohne das .py. Nur wenn man ein Modul ausführt, dann ist der Name an den Wert '__main__' gebunden. Wenn Du das Modul in einer Python-Shell oder einem anderen Modul importierst, dann wird auf diese Weise die main()-Funktion nicht ausgeführt. Und Du kannst die Funktionen in dem Modul zum Beispiel einzeln in der Shell verwenden, oder testen, oder in einem anderen Modul verwenden, oder automatisierte Tests laufen lassen, oder Dokumentation aus Docstrings erstellen lassen usw.

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

ah okay danke ☺

Antworten |