Ich ziehe Daten aus einem Google-Dokument, verarbeite sie und schreibe sie in eine Datei (die ich schließlich in eine Wordpress-Seite einfügen werde).
Es hat einige Nicht-ASCII-Symbole. Wie kann ich diese sicher in Symbole konvertieren, die in HTML-Quellen verwendet werden können?
Momentan konvertiere ich alles auf dem Weg nach Unicode, füge alles in einem Python-String zusammen und mache dann:
import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))
In der letzten Zeile ist ein Codierungsfehler aufgetreten:
UnicodeDecodeError: Der Codec 'ascii' kann das Byte 0xa0 an Position 12286 nicht dekodieren: Ordnungszahl nicht im Bereich (128)
Teillösung:
Dieser Python läuft ohne Fehler:
row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))
Aber wenn ich dann die eigentliche Textdatei öffne, sehe ich viele Symbole wie:
Qur’an
Vielleicht muss ich in etwas anderes als eine Textdatei schreiben?
Antworten:
Beschäftigen Sie sich so weit wie möglich ausschließlich mit Unicode-Objekten, indem Sie Dinge beim ersten Abrufen in Unicode-Objekte dekodieren und sie auf dem Weg nach draußen nach Bedarf codieren.
Wenn Ihre Zeichenfolge tatsächlich ein Unicode-Objekt ist, müssen Sie sie in ein Unicode-codiertes Zeichenfolgenobjekt konvertieren, bevor Sie sie in eine Datei schreiben:
Wenn Sie diese Datei erneut lesen, erhalten Sie eine Unicode-codierte Zeichenfolge, die Sie in ein Unicode-Objekt dekodieren können:
quelle
In Python 2.6+, könnten Sie verwenden
io.open()
das ist Standard ( builtinopen()
) auf Python 3:Es ist möglicherweise praktischer, wenn Sie den Text schrittweise schreiben müssen (Sie müssen nicht
unicode_text.encode(character_encoding)
mehrmals anrufen ). Im Gegensatz zumcodecs
Modul verfügt dasio
Modul über eine ordnungsgemäße Unterstützung für universelle Zeilenumbrüche.quelle
Die Behandlung von Unicode-Zeichenfolgen ist in Python 3 bereits standardisiert.
Sie müssen die Datei nur in utf-8 öffnen
(die 32-Bit-Konvertierung von utf-8 in Unicode in variable Byte-Länge wird automatisch vom Speicher in die Datei durchgeführt.)
quelle
Die von geöffnete Datei
codecs.open
ist eine Datei, dieunicode
Daten aufnimmt , codiertiso-8859-1
und in die Datei schreibt. Was Sie jedoch zu schreiben versuchen, ist nichtunicode
; du nimmstunicode
und verschlüsselst es iniso-8859-1
dir . Das ist, was dieunicode.encode
Methode tut, und das Ergebnis der Codierung einer Unicode-Zeichenfolge ist ein Bytestring (astr
Typ).Sie sollten entweder normal verwenden
open()
und den Unicode selbst codieren oder (normalerweise eine bessere Idee) die Daten selbst verwendencodecs.open()
und nicht codieren.quelle
Vorwort: Funktioniert Ihr Viewer?
Stellen Sie sicher, dass Ihr Viewer / Editor / Terminal (wie auch immer Sie mit Ihrer utf-8-codierten Datei interagieren) die Datei lesen kann. Dies ist häufig ein Problem unter Windows , z. B. Notepad.
Verwenden Sie in Python 2
open
dasio
Modul (dies entspricht demopen
in Python 3 integrierten):Best Practice wird im Allgemeinen
UTF-8
zum Schreiben in Dateien verwendet (wir müssen uns mit utf-8 nicht einmal um die Bytereihenfolge kümmern).utf-8 ist die modernste und universell verwendbare Codierung - es funktioniert in allen Webbrowsern, den meisten Texteditoren (siehe Ihre Einstellungen, wenn Sie Probleme haben) und den meisten Terminals / Shells.
Unter Windows können Sie versuchen
utf-16le
, die Ausgabe nur im Editor (oder einem anderen eingeschränkten Viewer) anzuzeigen.Öffnen Sie es einfach mit dem Kontextmanager und schreiben Sie Ihre Unicode-Zeichen auf:
Beispiel mit vielen Unicode-Zeichen
Hier ist ein Beispiel, das versucht, jedes mögliche Zeichen mit einer Breite von bis zu drei Bit (4 ist das Maximum, aber das würde ein bisschen weit gehen) von der digitalen Darstellung (in ganzen Zahlen) zusammen mit seinem Namen auf eine codierte druckbare Ausgabe abzubilden, wenn möglich (in eine Datei mit dem Namen
uni.py
):Dies sollte in der Größenordnung von ungefähr einer Minute ausgeführt werden, und Sie können die Datendatei anzeigen. Wenn Ihr Datei-Viewer Unicode anzeigen kann, wird dies angezeigt. Informationen zu den Kategorien finden Sie hier . Basierend auf den Zählungen können wir unsere Ergebnisse wahrscheinlich verbessern, indem wir die Kategorien Cn und Co ausschließen, denen keine Symbole zugeordnet sind.
Es wird die hexadezimale Zuordnung Kategorie angezeigt , das Symbol (es sei denn, der Name kann nicht abgerufen werden, also wahrscheinlich ein Steuerzeichen) und der Name des Symbols . z.B
Ich empfehle
less
unter Unix oder Cygwin (drucke / cat nicht die gesamte Datei für deine Ausgabe):zB wird ähnlich wie in den folgenden Zeilen angezeigt, die ich mit Python 2 (Unicode 5.2) daraus abgetastet habe:
Mein Python 3.5 von Anaconda hat Unicode 8.0, ich würde davon ausgehen, dass die meisten 3er dies tun würden.
quelle
So drucken Sie Unicode-Zeichen in eine Datei:
Speichern Sie dies in der Datei: foo.py:
Führen Sie es aus und leiten Sie die Ausgabe an die Datei weiter:
Öffnen Sie tmp.txt und schauen Sie hinein. Sie sehen Folgendes:
Sie haben also Unicode e mit einem Verschleierungszeichen in einer Datei gespeichert.
quelle
Dieser Fehler tritt auf, wenn Sie versuchen, eine Nicht-Unicode-Zeichenfolge zu codieren: Sie versucht, sie zu decodieren, vorausgesetzt, sie ist in einfachem ASCII-Format. Es gibt zwei Möglichkeiten:
f.write(all_html)
stattdessen..encode(...)
, wird zuerst versucht, es zu dekodieren.quelle
Beim Schreiben in Python3
Beim Schreiben in Python2:
Um diesen Fehler zu vermeiden, müssten Sie ihn mit den folgenden Codecs "utf-8" in Bytes codieren:
und dekodieren Sie die Daten beim Lesen mit den Codecs "utf-8":
Und auch wenn Sie versuchen, diese Zeichenfolge zu drucken, wird sie automatisch mit den folgenden Codecs "utf-8" dekodiert
quelle