Textdatei mit Python schreiben (FEHLER)

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
THE_PYTHON_GUY
User
Beiträge: 18
Registriert: Samstag 6. November 2021, 09:58

Hallo,
leider printed dieses Programm nur die variable zahl, aber schreibt sie nicht.

Code: Alles auswählen

p=print
datei = open('1.txt', 'r')
file = datei.read()
datei.close()
zahl = file
zahl = zahl.replace('a', "{")
zahl = zahl.replace('A', '{')
zahl = zahl.replace('b', '}')
zahl = zahl.replace('B', '}')
zahl = zahl.replace('c', '|')
zahl = zahl.replace('C', '|')
zahl = zahl.replace('d', '~')
zahl = zahl.replace('D', '~')
zahl = zahl.replace('e', '€')
zahl = zahl.replace('E', '€')
zahl = zahl.replace('f', '꛳')
zahl = zahl.replace('F', '꛳')
zahl = zahl.replace('g', '𑅃')
zahl = zahl.replace('G', '𑅃')
zahl = zahl.replace('h', '꘏')
zahl = zahl.replace('H', '꘏')
zahl = zahl.replace('i', '℻')
zahl = zahl.replace('I', '℻')
zahl = zahl.replace('j', '°')
zahl = zahl.replace('J', '°')
zahl = zahl.replace('k', '$')
zahl = zahl.replace('k', '$')
zahl = zahl.replace('l', '(')
zahl = zahl.replace('L', '(')
zahl = zahl.replace('m', '`')
zahl = zahl.replace('M', "`")
zahl = zahl.replace('n', '*')
zahl = zahl.replace('N', '*')
zahl = zahl.replace('o', '^')
zahl = zahl.replace('O', '^')
zahl = zahl.replace('p', '&')
zahl = zahl.replace('P', '&')
zahl = zahl.replace('q', '/')
zahl = zahl.replace('Q', '/')
zahl = zahl.replace('r', '=')
zahl = zahl.replace('R', '=')
zahl = zahl.replace('s', '-')
zahl = zahl.replace('S', '-')
zahl = zahl.replace('T', '_')
zahl = zahl.replace('t', '_')
zahl = zahl.replace('u', '#')
zahl = zahl.replace('U', '#')
zahl = zahl.replace('v', ';')
zahl = zahl.replace('V', ';')
zahl = zahl.replace('w', '☮')
zahl = zahl.replace('W', '☮')
zahl = zahl.replace('x', '<')
zahl = zahl.replace('X', '<')
zahl = zahl.replace('y', '>')
zahl = zahl.replace('Y', '>')
zahl = zahl.replace('z', '§')
zahl = zahl.replace('Z', '§')
zahl = zahl.replace("1", "⟲")
zahl = zahl.replace("2", "᧖")
zahl = zahl.replace("3", "☢")
zahl = zahl.replace("4", "፥")
zahl = zahl.replace("5", "☽")
zahl = zahl.replace("6", "☛")
zahl = zahl.replace("7", "꧙")
zahl = zahl.replace("8", "𑁣")
zahl = zahl.replace("9", "ᗯ")
zahl = zahl.replace("0", "卄")
p(zahl)
datei = open('2.txt', 'a')
datei.write(zahl)
datei.close()
Der Fehlercode lautet:

Code: Alles auswählen

UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zum oeffnen von Dateien benutzt man das with-statement. Damit werden die automatisch geschlossen. Und beim oeffnen einer Datei gibt man das erwartete encoding mit an. Fuer deinen Fall wohl am besten UTF-8. Und dann baut man nicht 100 mal die gleiche Zeile Code. Sondern deklariert eine Uebersetzungstabelle.

Code: Alles auswählen

import sys
TRANSLATIONS = {
   "7": "꧙",
   }


def main():
    with open(sys.argv[1], encoding="utf-8") as inf:
        text = inf.read()
    translated = "".join(TRANSLATIONS.get(c, c) for c in text)
    with open(sys.argv[2], "w", encoding="utf-8") as outf:
        outf.write(translated)


if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei eventuell die `translate()`-Methode auf Zeichenketten einen Blick Wert sein könnte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe die relativ bewusst nicht angeschaut, weil sie zumindest frueher einfach nur Byte-Ersetzungen vorgenommen hat. Ist die inzwischen unicode-faehig? Dann ist das natuerlich besser.
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Die war früher (also mindestens bei Python 2.7) auch schon unicode-fähig. Also die auf `unicode`-Objekten — nicht die auf `str`-Objekten. 🙂
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann ist die natuerlich besser.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@THE_PYTHON_GUY: print durch p abzukürzen, hat gleich drei Nachteile auf einmal: Du benutzt ein kryptisches Zeichen für eine bekannte Funktion, das heißt, man muß nicht nur p entziffern sondern auch nachschauen, was p denn eigentlich bedeutet, statt einfach nur `print` zu lesen und gleich zu wissen was passiert.
Warum nennst Du den Inhalt einer Datei `file` und warum nennst Du diese Variable dann in `zahl` um, wo bei all diesen komischen Zeichen der Inhalt bestimmt keine Zahl ist.
THE_PYTHON_GUY
User
Beiträge: 18
Registriert: Samstag 6. November 2021, 09:58

@Sirius3, zu dem print dieser Code ist eigentlich nur für den Eigenbedarf bestimmt daher ist das eigentlich auch egal. Die Variable "zahl" stammt aus einem äteren Skript, wo "zahl" noch sinn ergeben hätte, dieses habe ich aber abgewandelt und aus zeitgründen nicht noch die Variable bei jedem Befehl umgeschrieben.

Trotzdem danke!
Antworten