# -*-coding: utf8 -*-

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Hallo,
die Coding-Zeile eines Programmes lautet:

Code: Alles auswählen

# -*-coding: utf8 -*-
Ist die Zeile so richtig?

Warum beginnt die Zeile mit dem Zeichen #? Meines Wissens handelt es sich bei diesem Zeichen um die Kennzeichnung eines Kommentars, die Python überhaupt nicht liest, weil es eben ein Kommentar ist. Wird die Zeile doch von Python gelesen? Wenn ja - warum?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bill987654321: Die Zeile ist so richtig, auch wenn ich vor dem "coding" noch ein Leerzeichen setzen würde. Die Zeile muss von diesem regulären Ausdruck erkannt werden können: r"^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)" und entweder in der ersten oder der zweiten Zeile des Quelltextes stehen.

Ja "#" ist das Zeichen das einen Kommentar einleitet. Der Compiler ignoriert Kommentare. Die Zeile wird vor dem kompilieren ausgewertet um den Quelltext von Bytes in Text dekodieren zu können, den der Compiler dann übergeben bekommt. Warum? Weil das notwendig ist, und weil das in der Sprachspezifikation so festgelegt ist.

Speziell diesen Kommentar kann man sich aber auch sparen, denn UTF-8 ist das was angenommen wird wenn kein solcher Kommentar vorhanden ist. In Python 3.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Habe ich das richtig verstanden, dass diese Zeile trotz "#" von Python gelesen wird?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, wird sie. Sie wird aber auch von Editoren (zB vim und Emacs) ausgewertet.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ja. Normalerweise steht die Anweisung in der ersten Zeile, es sei denn, dass dort eine 'shebang' Information für das OS vorhanden ist (die auch mit # beginnt).
Wichtig ist, dass, wenn du eine Coding-Information einbringst, die Datei auch tatsächlich in dieser Codierung gespeichert wird.
Bei Python 3 nimmst du einfach utf-8, brauchst in diesem Fall die Codierung nicht anzugeben, und alles ist gut.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Danke :D
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Irgendwas funktioniert nicht.
Der Code lautet:

Code: Alles auswählen

anzahl_mannschaften=4

vereinsnamen=[]
for i in range (1, anzahl_mannschaften+1):
    mannschaft = input(f"Gebe den Namen der {i}. Mannschaft ein: ")
    print (f"Die {i}. Mannschaft ist {mannschaft}")
    vereinsnamen.append(mannschaft)
    print(i)
    print (type (i))
    print (mannschaft)
    # liste_vereinsnamen wird angezeigt
    print ((vereinsnamen),("vereinsnamen"))
    print ("Leerzeile")
    
# file_Mannschaftsnamen wird erzeugt
file_Mannschaftsnamen = open("Mannschaftsnamen.txt","w")
file_Mannschaftsnamen.write(str(vereinsnamen))
file_Mannschaftsnamen.close

print (vereinsnamen)

# und wieder laden:
file_Mannschaftsnamen = open("Mannschaftsnamen.txt","r")
file_Mannschaftsnamen.close
print("vereinsnamen aus file")
print (vereinsnamen)

for i in range (1, anzahl_mannschaften+1):
    print (vereinsnamen)
      
print ("End")
Ausgegeben wird:

Gebe den Namen der 1. Mannschaft ein: Köln
Die 1. Mannschaft ist Köln
1
<class 'int'>
Köln
['Köln'] vereinsnamen
Leerzeile
Gebe den Namen der 2. Mannschaft ein: Düsseldorf
Die 2. Mannschaft ist Düsseldorf
2
<class 'int'>
Düsseldorf
['Köln', 'Düsseldorf'] vereinsnamen
Leerzeile
Gebe den Namen der 3. Mannschaft ein: Bremen
Die 3. Mannschaft ist Bremen
3
<class 'int'>
Bremen
['Köln', 'Düsseldorf', 'Bremen'] vereinsnamen
Leerzeile
Gebe den Namen der 4. Mannschaft ein: Hamburg
Die 4. Mannschaft ist Hamburg
4
<class 'int'>
Hamburg
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg'] vereinsnamen
Leerzeile
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg']
vereinsnamen aus file
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg']
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg']
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg']
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg']
['Köln', 'Düsseldorf', 'Bremen', 'Hamburg']
End

Das ist alles richtig.

Aber wenn ich die txt.Datei öffne geht das Fenster "Dateikonvertierung" auf. Es ist "andere Codierung" ausgewählt und die beiden Umlaute werden falsch angezeigt. Wenn ich "Unicode (utf-8)" auswähle werden die beiden Umlaute wieder falsch angezeigt aber diesmal durch gekippte schwarze Quadrate mit einem Fragezeichen drin.

Was mache ich falsch?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast kein Encoding angegeben, so dass die Datei im Systemencoding geschrieben wird, was auch immer das ist. close sollte man auch aufrufen und die Listerepräsentation ist nicht zur Speicherung gedacht!
Wie man richtig in die Datei schreibt habe ich ja schon im anderen Thread gezeigt:

Code: Alles auswählen

with open("Mannschaftsnamen.txt", "w", encoding="utf8") as output:
    for vereinsname in vereinsnamen:
        output.write(f"{vereinsname}\n")
Und Laden (was Du im Moment gar nichts machst, und was auch mit Deinem "Dateiformat" gar nicht so einfach geht):

Code: Alles auswählen

vereinsnamen = []
with open("Mannschaftsnamen.txt", encoding="utf8") as lines:
    for line in lines:
        vereinsnamen.append(line.rstrip())
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Alternativ für's einesen:

Code: Alles auswählen

with open("Mannschaftsnamen.txt", encoding="utf-8") as lines:
    vereinsnamen = [line.rstrip() for line in lines]
Und der Dateiname sollte als Konstante definiert werden wenn er mehrfach verwendet wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Danke für die Antwort.

Wie sieht die Definition aus?
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Konstanten werden per Definition KOMPLETT_GROSS geschrieben:

Code: Alles auswählen

MANNSCHAFTEN_DATEINAME = "Mannschftsnamen.txt"
Dann musst du, falls sich der Name mal ändert, nur eine Stelle im Code anpassen.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und auch wenn sich der Name nicht ändert: man muss ihn dann nicht mehrfach schreiben, jedes mal mit der kleinen Gefahr das man sich vertüppt. Kann beim Namen der Konstante natürlich auch passieren, aber so etwas fällt beim Ausführen auf jeden Fall sofort mit einem `NameError` auf. Eventuell auch schon vorher wenn man eine statische Analyse über den Quelltext laufen lässt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

(...) jedes mal mit der kleinen Gefahr das man sich vertüppt.
Witzigerweise ist mir genau das just in meinem letzten Post passiert. Die Datei müsste "Mannschaftsnamen.txt." heißen. So schnell kanns gehen :D
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Siehe neues Thema
Antworten