2011-01-13 4 views
6

Beim Importieren einer Datei mit Tabstopps als Trennzeichen über HTTP in Python.Importieren einer Datei mit unbekannter Codierung aus Python in MongoDB

Bevor Sie die Daten einer Zeile in MongoDB einfügen, entferne ich Schrägstriche, Ticks und Zitate aus der Zeichenfolge.

Unabhängig von der Codierung der Daten, MongoDB mir die Ausnahme wirft:

bson.errors.InvalidStringData: strings in documents must be valid UTF-8 

So in dem Bemühen, dieses Problem zu lösen, aus der Lektüre ich getan habe, möchte ich so schnell wie möglich Konvertieren Sie die Daten der Zeile mit der Funktion unicode() in Unicode. Darüber hinaus habe ich versucht, die decode() Funktion übergeben „Unicode“ als ersten Parameter aufrufen, aber die Fehlermeldung:

LookupError: unknown encoding: unicode 

Von dort aus kann ich meine Stringmanipulationen wie das Ersetzen der Schrägstriche, Zecken machen, und Zitate. Dann, bevor Sie die Daten in MongoDB einfügen, konvertieren Sie es in UTF-8 mit der Funktion Str.encode ('utf-8').

Problem: Wenn in Unicode konvertieren, ich den Fehler erhalte

UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128) 

Mit diesem Fehler, ich bin nicht sicher, wo genau fortzusetzen.

Meine Frage ist: Wie importiere ich erfolgreich die Daten aus einer Datei, ohne ihre Codierung zu kennen und sie erfolgreich in MongoDB einzufügen, die UTF-8 benötigt?

Vielen Dank!

+0

Warum ist dieser Tag "csv"? –

+0

Aber Sie sagten "Importieren einer Tab-getrennte Datei über HTTP" ... wo passt "CSV" hinein? –

Antwort

7

Versuchen Sie diese in der Reihenfolge:

(0) Überprüfen Sie, ob das Entfernen der Schrägstriche/Ticks/etc werden die Daten nicht schlachten. Was ist ein Tick? Bitte zeigen Sie Ihren Code. Bitte zeigen Sie ein Beispiel der Rohdaten ... verwenden Sie print repr(sample_raw data) und kopieren Sie die Ausgabe in eine Bearbeitung Ihrer Frage.

(1) Es gibt eine alte Maxime: "Wenn die Kodierung einer Datei unbekannt ist, oder als ISO-8859-1 angegeben wird, ist es cp1252" ... woher bekommen Sie es? Wenn es kommt aus Westeuropa, Nord- und Südamerika, oder jeder Englisch/Französisch/Spanisch sprechenden Land/Gebiet anderswo, und es ist nicht gültig UTF-8, dann ist es wahrscheinlich, cp1252

[Edit 2] Ihre Fehler sein Byte 0x93 entschlüsselt zu U + 201C LINKS DOUBLE QUOTATION MARK für alle Codierungen cp1250 bis cp1258 inklusive ... In welcher Sprache ist der Text geschrieben? [/ Edit 2]

(2) Speichern Sie die Datei (vor dem Entfernen der Zecke), und öffnen Sie die Datei in Ihrem Browser: Sieht es sinnvoll aus? Was siehst du, wenn du auf View/Character Encoding klickst?

(3) Versuchen chardet

bearbeiten mit etwas mehr Beratung:

Sobald Sie wissen, was die Codierung (nehmen wir an, es ist cp1252):

(1) wandeln Sie Ihre Eingabedaten Unicode: uc = raw_data.decode('cp1252')

(2) die Daten verarbeiten (entfernen Schrägstriche/ticks/etc) als Unicode:

clean_uc = manipulate(uc)

(3) Sie müssen Ihre Daten codiert als UTF-8 zur Ausgabe: to_mongo = clean_uc.encode('utf8')

Anmerkung 1: Ihre Fehlermeldung lautet „kann nicht Byte 0x93 in Position dekodieren 1258“ ... 1258 Bytes ist ein ziemlich langer Brocken Text; ist das vernünftig? Haben Sie sich die Daten angesehen, über die sie sich beschweren? Wie? was hast du gesehen?

Hinweis 2: Bitte beachten Sie, Lesen the Python Unicode HOWTO und this article

+0

@Joshua Burns: Danke, dass du die Antwort akzeptierst, aber zukünftige Leser werden mich gerne fragen, was das Ergebnis war ... cp1252 oder etwas anderes? –

+0

@Joshua Burns: Entschuldigung, ich verstehe "in der Tat" nicht. Ich habe nicht gesagt, dass es Latin-1 war. Ich sagte, es wäre wahrscheinlich cp125X. Latin-1 ist nicht cp125X. Ihr Fehlerbyte 0x93 ist ein merkwürdiges, niemals in der realen Welt gesehenes Steuerelement, das sich bei der Decodierung als Latin-1-Befehl ändert. –

+0

Die Datei wurde ursprünglich in Englisch geschrieben und wurde von einer externen Quelle bereitgestellt. Ich nehme an, irgendwo auf der ganzen Linie wurden einige Daten korrupt und wurden nie repariert. Codieren des Textes als Latin-1 löste das Problem für dieses Szenario, obwohl es bedeutet, dass ein nicht realistisches Zeichen dargestellt wurde. –

Verwandte Themen