.txt File speichern, dass die Zeichencodierung des Files (des Files!) Unicode ist

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
Anna_Prinetsol
User
Beiträge: 4
Registriert: Dienstag 5. März 2019, 11:32

Liebe Leute,

zum Thema Unicode hab ich zahlreiche Einträge gefunden, aber nicht zu dem Problem, das ich gerade lösen soll.
Ich habe einen Code, der ein .txt File liest, den Inhalt dessen bearbeitet, dann das Ergebnis in ein .txt File speichert. (Ich arbeite mit Python 3.x)
Es geht soweit in Ordnung. Dieses .txt-File wird aber von einer anderen Software gelesen. Die braucht ein File mit der Zeichencodierung Unicode, das von mir erstelle File hat aber UTF-8. (Den Inhalt, den mein Python Code liest, ist auch in einem File mit UTF-8 gespeichert.)

Das von mir erstellete File wird in UTF-8 Zeichnkodoerung gespeichert. Ganz einfach gesagt: ich muss dann dieses File im Editor öffnen, auf "Speichern unter" klicken, bei der Zeichencodierung "Unicode" auswählen, dann speichern. Und das sollte automatisch gehen. Kann ich es von Python aus steuern?

Ich habe einen kleinen Test-Code.

Code: Alles auswählen

##### So wird das erstellte File mit ANSI Zeichenkodoerung gespeichert

import codecs
w_text = ''

with open("P://PriNetSol/DB/entwicklung/python/test/test_unicode_write.xml", "wb") as write_file:

    w_text = 'blabla'
    write_file.write(w_text.encode('utf-8'))

##### auch das wird ANSI

import codecs
w_text = ''

with codecs.open("P://PriNetSol/DB/entwicklung/python/test/test_unicode_write.xml", "w", "utf-8") as write_file:

    w_text = 'blabla'

Also ANSI und UTF-8 bringe ich zusammen.... brauche ich aber nicht... Kann mir jemand helfen, wie ich die Zeichencodierung von erstellten File (also von File... nicht von den verwendeten Zeichen...) beeinflussen kann?

Vielen Dank!
Lg, Anna
write_file.write(w_text)
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Anna_Prinetsol: Es gibt keine Zeichenkodierung die „Unicode“ heisst. Also müsstest Du als erstes mal heraus finden was die Software tatsächlich als Kodierung haben möchte. Eine Zeichenkodierung die „ANSI“ heisst gibt es übrigens auch nicht. Wenn Du eine Software hast, die diese Bezeichnungen für Kodierungen verwendet, dann taugt die nichts.

Bei Python 3 verwendet man einfach das ganz normale `open()` mit einem `encodig`-Argument. `codecs.open()` ist noch ein Überbleibsel aus Python 2.

Wenn Du den Text UTF-8 kodiert speicherst, dann wird der auch, wer hätte es gedacht, als UTF-8 kodiert gespeichert. Das nennt keine mir bekannte Software „ANSI“.

Wobei wenn es sich um XML handelt, dann kümmert sich ja die XML-Bibliothek um die korrekte Kodierung. Kann es also sein das Du hier versuchst XML einfach wie eine Textdatei zu behandeln, statt eine XML-Bibliothek dafür zu verwenden?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das macht so erstmal keinen Sinn. Denn es gibt keine Zeichen-Kodierung "unicode". Der gesamte Standard heisst unicode, aber die konkreten Kodierungen haben andere Namen.

Wenn du nun einen Editor hast, der einfach eine bestimmte Kodierung "unicode" nennt, dann ist das erstmal hochgradig verwirrend und willkuerlich. Ich nehme mal an, dass es sich um ein Windows-Programm handelt, und in dem Kontext meint der werte Autor dann wohl "UTF-16".

Und genau das ist auch, was du dann in deiner Anweisung zum oeffnen zwecks schreiben angeben musst - statt utf-8.

Zumindest waere das mal meine Vermutung. Wissen kann man das nicht, dazu muesstest du mal eine solche Datei die nach Konvertierung mit dem Editor entstanden ist zeigen. Das koennen auch Test-daten sein, wenn die originalen Dokumente geheim sind. WICHTIG: nicht copy/paste hier, das ist natuerlich sinnlos! Sondern die datei zB auf pastebin.com hochladen, und dann hier verlinken.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

EDIT: https://de.wikipedia.org/wiki/ANSI-Zeichencode
Ich habe in diesem Beispiel iso8859-1 verwendet, dass dem ANSI-Standard entsprechen soll.
Es gab auch einen davor. Falls das die falsche Kodierung ist, teste mal latin1 oder cp1252 als Kodierung.

Du bringst etwas durcheinander.

Es gibt einen Unicode-Standard, der lediglich die Codpoints definiert.
Mittlerweile müssten wir bei Version 11 angelangt sein (neue Emoticons).

Als Kodierung für Unicode wird fast überall UTF-8 genutzt, es gibt daneben aber noch weitere Kodierungen. UFT-16, UTF-32.

Um nun den Text mit den entsprechenden Codierung zu speichern, gibt es mehrere Möglichkeiten.
Die einfachste Möglichkeit ist es das gewünschte encoding direkt als Argument der open-Funktion zu übergeben.

Code: Alles auswählen

with open('test.txt', 'w', encoding='iso8859-1') as fd:
    fd.write('äüößßß')
Alternativ in raw mode, explizite encodierung:

Code: Alles auswählen

with open('test.txt', 'wb') as fd:
    text = 'äüößßß'.encode('iso8859-1')
    fd.write(text) # raw bytes
Mit Pathlib objekten funktioniert das auch:

Code: Alles auswählen

textdatei = pathlib.Path('test.txt')
with textdatei.open(encoding='iso8859-1') as fd:
    print(fd.read())
Dann haben die Path-Objekte noch eine Helper-Funktion:

Code: Alles auswählen

textdatei = pathlib.Path('test.txt')
text = textdatei.read_text(encoding='iso8859-1')
print(text)
Geht auch umgekehrt:

Code: Alles auswählen

textdatei = pathlib.Path('test.txt')
text = textdatei.write_text('ääääßßßüüüöööö' ,encoding='iso8859-1')
An die Zeiten vor Python 3.x will ich jetzt nicht denken.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: In den Zeiten vor Python 3.x war das alles ganz genau so. Man hat entweder `codecs.open()`/`io.open()` mit expliziter Kodierung verwendet, oder mit Binärdatei und `encode()`/`decode()` gearbeitet. Einziger Unterschied: Man musste vor Unicode-Zeichenkettenliterale ein u schreiben. Sofern die etwas ausserhalb von ASCII enthalten. Sonst kann man das auch weg lassen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten