Unicode-Problem mit SQLAlchemy
Ich weiß, ich habe da ein problem mit einer Konvertierung von Unicode, aber ich bin mir nicht sicher, wo es passiert.
Ich bin die Extraktion von Daten über eine der jüngsten Europäischen Reise aus einem Verzeichnis der HTML-Dateien. Einige der Ortsnamen nicht-ASCII-Sonderzeichen (wie é, ô, ü). Ich bekomme die Daten von einem string-Darstellung, die die Datei mit regex.
Wenn ich drucken Sie die Standorte wie finde ich Sie, drucken Sie mit dem Zeichen, so dass die Kodierung muss ok sein:
Le Pré-Saint-Gervais, France
Hôtel-de-Ville, France
Bin ich der Speicherung der Daten in eine SQLite-Tabelle mit SQLAlchemy:
Base = declarative_base()
class Point(Base):
__tablename__ = 'points'
id = Column(Integer, primary_key=True)
pdate = Column(Date)
ptime = Column(Time)
location = Column(Unicode(32))
weather = Column(String(16))
high = Column(Float)
low = Column(Float)
lat = Column(String(16))
lon = Column(String(16))
image = Column(String(64))
caption = Column(String(64))
def __init__(self, filename, pdate, ptime, location, weather, high, low, lat, lon, image, caption):
self.filename = filename
self.pdate = pdate
self.ptime = ptime
self.location = location
self.weather = weather
self.high = high
self.low = low
self.lat = lat
self.lon = lon
self.image = image
self.caption = caption
def __repr__(self):
return "<Point('%s','%s','%s')>" % (self.filename, self.pdate, self.ptime)
engine = create_engine('sqlite:///:memory:', echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(bind = engine)
session = Session()
Ich eine Schleife durch die Dateien und legen die Daten jeweils in die Datenbank:
for filename in filelist:
# open the file and extract the information using regex such as:
location_re = re.compile("<h2>(.*)</h2>",re.M)
# extract other data
newpoint = Point(filename, pdate, ptime, location, weather, high, low, lat, lon, image, caption)
session.add(newpoint)
session.commit()
Sehe ich folgende Warnung auf jedem einfügen:
/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/engine/default.py:230: SAWarning: Unicode type received non-unicode bind param value 'Spitalfields, United Kingdom'
param.append(processors[key](compiled_params[key]))
Und wenn ich versuche, etwas zu tun mit der Tabelle, wie z.B.:
session.query(Point).all()
Bekomme ich:
Traceback (most recent call last):
File "./extract_trips.py", line 131, in <module>
session.query(Point).all()
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/orm/query.py", line 1193, in all
return list(self)
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/orm/query.py", line 1341, in instances
fetch = cursor.fetchall()
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/engine/base.py", line 1642, in fetchall
self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.4p2-py2.5.egg/sqlalchemy/engine/base.py", line 931, in _handle_dbapi_exception
raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
sqlalchemy.exc.OperationalError: (OperationalError) Could not decode to UTF-8 column 'points_location' with text 'Le Pré-Saint-Gervais, France' None None
Ich würde gerne in der Lage, richtig zu speichern und dann wieder die Ortsnamen mit den ursprünglichen Zeichen intakt. Jede Hilfe wäre sehr geschätzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich diesen Artikel dazu beigetragen, erklären, dass meine Probleme etwas:
http://www.amk.ca/python/howto/unicode#reading-and-writing-unicode-data
War ich in der Lage, die gewünschten Ergebnisse zu erhalten, mit den "codecs" - Modul und dann ändern mein Programm wie folgt aus:
Beim öffnen der Datei:
Beim drucken der Lage:
Kann ich nun Abfragen und manipulieren der Daten aus der Tabelle, ohne die Fehler aus vor. Ich habe nur das encoding anzugeben, wenn ich die Ausgabe den text.
(Ich weiß immer noch nicht so ganz verstehen, wie dies funktioniert so, ich denke, es ist Zeit zu lernen, mehr über Python-unicode-Behandlung...)
Vom sqlalchemy.org
Siehe Abschnitt 0.4.2
Ich denke, Sie versuchen, Sie zur Eingabe eines nicht-unicode-bytestring. Vielleicht könnte dies dazu führen Sie auf der richtigen Spur? Irgendeine form der Konvertierung erforderlich ist, vergleichen Sie 'Hallo' und u'hello'.
Cheers
Versuchen Sie es mit einer Spalte Typ der Unicode anstelle von Zeichenfolge für unicode-Spalten:
Edit: Antwort zu Kommentar:
Wenn Sie Warnungen über unicode-Kodierungen, dann gibt es zwei Dinge, die Sie ausprobieren können:
Konvertieren Sie Ihre Position in unicode. Dies würde bedeuten, dass Sie Ihren Punkt wie folgt erstellt:
newpoint = Point(mit dem Namen, pdate, ptime, unicode(Position), Wetter, hoch, niedrig, lat, lon, Bild, Beschriftung)
Die unicode-Konvertierung erzeugt einen unicode-string übergeben wird entweder ein string oder ein unicode-string, so brauchen Sie nicht sorgen zu machen über das, was Sie übergeben.
Wenn das nicht lösen der Probleme der Zeichenkodierung, versuchen Sie den Aufruf von encode auf Ihre unicode-Objekte. Das würde bedeuten, dass mit code wie:
newpoint = Point(mit dem Namen, pdate, ptime, unicode(Position).encode('utf-8'), Wetter, hoch, niedrig, lat, lon, Bild, Beschriftung)
Dieser Schritt wird wahrscheinlich nicht notwendig sein, aber was es im Grunde tut, ist, konvertiert eine unicode-Objekt von unicode-code-points, um eine bestimmte byte-Darstellung (in diesem Fall utf-8). Ich würde erwarten, dass SQLAlchemy, dies zu tun für Sie, wenn Sie pass in unicode Objekte, dürfen es aber nicht.