2016-04-25 6 views
0

ich versuche, ein „string“ in eine Datei zu schreiben und die folgende Fehlermeldung:Wie schreibe ich ein Unicode-Objekt in eine Datei in Python?

UnicodeEncodeError: 'ascii' codec can't encode character u'\xcd' in position 6: ordinal not in range(128) 

ich die folgenden Methoden versucht:

print >>f, txt 
print >>f, txt.decode('utf-8') 
print >>f, txt.encode('utf-8') 

Keiner von ihnen arbeiten. Ich habe die gleiche Fehlermeldung.

Was ist die Idee hinter der Codierung und Decodierung? Wenn ich ein Unicode-Objekt habe, kann ich es direkt in die Datei schreiben oder muss ich es in eine Zeichenkette umwandeln?

Wie kann ich herausfinden, welche Kodierung verwendet wird? Wie kann ich wissen, ob es utf-8 oder ascii oder etwas anderes ist?

ADDED

Ich glaube, ich habe gerade einen String in einer Datei speichern verwaltet. print >>f, txt sowie print >>f, txt.decode('utf-8') haben nicht funktioniert, aber print >>f, txt.encode('utf-8') funktioniert. Ich bekomme keine Fehlermeldung und ich sehe chinesische Zeichen in meiner Datei.

+1

Und was ist diese Zeichenfolge? – EbraHim

+0

@EbraHim, ich vermute, dass es ein Unicode-Objekt ist, weil ich die Strings durch Lesen auf folgende Weise erhalten habe: 'für Zeile in io.open (fname, encoding =" utf8 "):' – Roman

+0

@Roman für Zeile in io .open (fname, encoding = "utf8"): Ändern Sie die Codierung in utf-8 – Mani

Antwort

1

Ich glaube, Sie brauchen Codecs Bibliothek zu verwenden:

import codecs 

file = codecs.open("test.txt", "w", "utf-8") 
file.write(u'\xcd') 
file.close() 

funktioniert.

Die Geschichte der Codierung/Decodierung:

In der Vergangenheit gab es nur etwa ~ 60 in Computern verfügbar Zeichen (einschließlich Groß- und Kleinbuchstaben + Zahlen + Sonderzeichen). Also nur 1 Byte war genug, um jedem Buchstaben eine eindeutige Nummer zuzuordnen. Das Zuordnen von Nummern zu Buchstaben zum Speichern im Speicher wird als Codierung bezeichnet. Diese Ein-Byte-Kodierung, die standardmäßig in Python verwendet wird, heißt ASCII.

Mit dem Wachstum von Computern in der Welt müssen wir mehr Buchstaben und Zeichen im Computer haben. Also 1 Byte ist nicht genug. Verschiedene Kodierungsschemata erschienen. Unicode ist einer der berühmtesten. Das Zeichen, das Sie in Ihrer Datei speichern möchten, ist ein Unicode - Zeichen und benötigt 2 Bytes. Sie müssen also Python explizit anzeigen, dass Sie nicht die Standardcodierung verwenden möchten, dh das ASCII (weil Sie 2 Bytes für dieser Charakter).

3

Ich schrieb vor kurzem another answer, die genau dieses Problem anspricht. Key Zitat:

Für einen guten Überblick über den Unterschied, lesen one of Joel's articles, aber das Wesentliche ist, dass Bytes sind, nun ja, Bytes (Gruppen von 8 Bits ohne weitere Bedeutung im Anhang), während Zeichen sind die Dinge, die machen up Strings von Text. Die Codierung wandelt Zeichen in Bytes um, und durch die Decodierung werden Bytes wieder in Zeichen umgewandelt.

In Python 2, unicode Objekte sind Zeichenketten. Reguläre str Objekte können entweder Zeichenfolgen oder Bytefolgen sein. (Pro-Tipp: Verwenden Sie Python 3, es macht die Verfolgung viel einfacher.)

Sie sollten Charakter Strings (nicht Byte-Strings) zu print werden vorbei, aber Sie werden sicher sein müssen, dass können diese Zeichenketten durch den Codec (wie ASCII oder UTF-8) im Zusammenhang mit der codiert werden Zieldateiobjekt f. Als Teil des Ausgabeprozesses codiert Python die Zeichenfolge für Sie. Wenn die Zeichenfolge Zeichen enthält, die nicht vom Codec des Dateiobjekts codiert werden können, erhalten Sie Fehler wie die, die Sie sehen.

Ohne zu wissen, was in Ihrem txt Objekt ist, kann ich nicht genauer sein.

Verwandte Themen