Ich weiß, dass ich ein Problem mit einer Konvertierung von Unicode habe, aber ich bin mir nicht sicher, wo es passiert.
Ich extrahiere Daten über eine kürzlich durchgeführte Reise nach Europa aus einem Verzeichnis von HTML-Dateien. Einige der Ortsnamen haben Nicht-ASCII-Zeichen (wie z. B. é, ô, ü). Ich erhalte die Daten aus einer String-Repräsentation der Datei mit Regex.
Wenn ich die Orte so drucke, wie ich sie finde, werden sie mit den Zeichen gedruckt, so dass die Codierung in Ordnung sein muss:
%Vor%Ich speichere die Daten in einer SQLite-Tabelle mit SQLAlchemy:
%Vor%Ich durchlaufe die Dateien und füge die Daten von jedem in die Datenbank ein:
%Vor%Ich sehe die folgende Warnung auf jedem Einsatz:
%Vor%Und wenn ich versuche, etwas mit der Tabelle zu tun, wie zum Beispiel:
%Vor%Ich bekomme:
%Vor%Ich möchte in der Lage sein, die Ortsnamen mit den ursprünglichen intakten Zeichen korrekt zu speichern und dann zurückzugeben. Jede Hilfe würde sehr geschätzt werden.
Ich fand diesen Artikel, der dazu beitrug, meine Probleme etwas zu erklären:
Ich konnte die gewünschten Ergebnisse erzielen, indem ich das Modul 'Codecs' verwendete und dann mein Programm wie folgt änderte:
Beim Öffnen der Datei:
%Vor%Beim Drucken des Standorts:
%Vor%Ich kann jetzt die Daten aus der Tabelle abfragen und bearbeiten, ohne den Fehler von vorher. Ich muss nur die Codierung angeben, wenn ich den Text ausgabe.
(Ich verstehe immer noch nicht ganz, wie das funktioniert, also denke ich, es ist Zeit, mehr über Pythons Unicode-Handhabung zu erfahren ...)
Von sqlalchemy.org
Siehe Abschnitt 0.4.2
hat eine neue Flagge zu String und hinzugefügt create_engine (), assert _unicode = (Wahr | Falsch | 'warnen' | Keine). Der Standardwert ist
False
oderNone
on create _engine () und String,'warn'
für den Unicode-Typ. Wann %Code%, führt zu allen Unicode - Konvertierungsoperationen, die ein Ausnahme wenn a Non-Unicode-Bytestring wird als Bindungsparameter übergeben. 'warnen' Ergebnisse in einer Warnung. Es wird dringend empfohlen, dass alle Unicode-bewusst sind Anwendungen Verwenden Sie Python-Unicode-Objekte richtig (d. h. u'hello 'und nicht 'Hallo') so dass Daten Rundreisen genau.
Ich denke, Sie versuchen, einen Nicht-Unicode-Byte-String einzugeben. Vielleicht führt Sie das auf die richtige Spur? Irgendeine Form der Umwandlung wird benötigt, vergleiche "Hallo" und "Hallo".
Prost
Versuchen Sie, für die Unicode-Spalten einen Spaltentyp Unicode anstelle von String zu verwenden:
%Vor%Bearbeiten: Antwort auf Kommentar:
Wenn Sie Warnungen über Unicode-Kodierungen erhalten, können Sie zwei Dinge ausprobieren:
Konvertiere deinen Standort in Unicode. Dies würde bedeuten, dass dein Point wie folgt erstellt wird:
newpoint = Punkt (Dateiname, pdate, ptime, Unicode (Ort), Wetter, hoch, niedrig, lat, lon, Bild, Bildunterschrift)
Die Unicode-Konvertierung erzeugt eine Unicode-Zeichenfolge, wenn sie entweder als Zeichenfolge oder als Unicode-Zeichenfolge übergeben wird. Sie müssen sich also nicht darum kümmern, was Sie übergeben.
Wenn das die Codierungsprobleme nicht löst, versuchen Sie, Encode auf Ihren Unicode-Objekten aufzurufen. Das würde bedeuten, einen Code wie:
zu verwendennewpoint = Punkt (Dateiname, pdate, ptime, Unicode (Ort) .encode ('utf-8'), Wetter, hoch, niedrig, lat, lon, Bild, Bildunterschrift)
Dieser Schritt ist wahrscheinlich nicht notwendig, aber was er im Wesentlichen tut, ist das Konvertieren eines Unicode-Objekts von Unicode-Codepunkten in eine bestimmte Byte-Repräsentation (in diesem Fall utf-8). Ich würde erwarten, dass SQLAlchemy dies für Sie tut, wenn Sie Unicode-Objekte übergeben, aber es möglicherweise nicht.
Tags und Links python character-encoding unicode encoding sqlalchemy