Ich versuche, mit einem sehr großen Datensatz zu arbeiten, der einige nicht standardmäßige Zeichen enthält. Ich muss Unicode gemäß den Jobspezifikationen verwenden, bin aber verblüfft. (Und möglicherweise alles falsch machen.)
Ich öffne die CSV mit:
15 ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')
Dann versuche ich es zu codieren mit:
name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
Ich codiere alles außer lat und lng, weil diese an eine API gesendet werden müssen. Wenn ich das Programm ausführe, um den Datensatz in das zu analysieren, was ich verwenden kann, erhalte ich den folgenden Traceback.
Traceback (most recent call last):
File "push_into_db.py", line 80, in <module>
main()
File "push_into_db.py", line 74, in main
district_map = buildDistrictSchoolMap()
File "push_into_db.py", line 32, in buildDistrictSchoolMap
county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
Ich denke, ich sollte Ihnen sagen, dass ich Python 2.7.2 verwende, und dies ist Teil einer App, die auf Django 1.4 basiert. Ich habe mehrere Beiträge zu diesem Thema gelesen, aber keiner von ihnen scheint direkt zuzutreffen. Jede Hilfe wird sehr geschätzt.
Vielleicht möchten Sie auch wissen, dass einige der nicht standardmäßigen Zeichen, die das Problem verursachen, Ñ und möglicherweise É sind.
Antworten:
Unicode ist nicht gleich UTF-8. Letzteres ist nur eine Kodierung für Ersteres.
Du machst es falsch herum. Sie lesen UTF-8- codierte Daten, daher müssen Sie den UTF-8-codierten String in einen Unicode-String decodieren .
So ersetzen Sie einfach
.encode
mit.decode
, und es sollte funktionieren (wenn Ihre CSV - UTF-8-codiert).Nichts, wofür man sich schämen müsste. Ich wette, 3 von 5 Programmierern hatten Probleme, dies zuerst zu verstehen, wenn nicht mehr;)
Update: Wenn Ihre Eingabedaten nicht UTF-8-codiert sind, müssen Sie
.decode()
natürlich die entsprechende Codierung verwenden. Wenn nichts angegeben ist, geht Python von ASCII aus, was bei Nicht-ASCII-Zeichen offensichtlich fehlschlägt.quelle
.decode('utf-8')
sollte man dann den Trick machen, noch?Fügen Sie einfach diese Zeilen zu Ihren Codes hinzu:
quelle
für Python 3 Benutzer. du kannst tun
es funktioniert auch mit flasche :)
quelle
Der Hauptgrund für den Fehler ist, dass die von Python angenommene Standardcodierung ASCII ist. Wenn die zu codierenden Zeichenfolgendaten
encode('utf8')
Zeichen enthalten, die außerhalb des ASCII-Bereichs liegen, z. B. für eine Zeichenfolge wie 'hgvcj 파크 파크 387', würde Python einen Fehler auslösen, da die Zeichenfolge nicht das erwartete Codierungsformat aufweist.Wenn Sie eine frühere Python-Version als Version 3.5 verwenden, besteht eine zuverlässige Lösung darin, die von Python angenommene Standardcodierung auf Folgendes festzulegen
utf8
:Auf diese Weise kann Python Zeichen innerhalb einer Zeichenfolge antizipieren, die außerhalb des ASCII-Bereichs liegen.
Wenn Sie jedoch Python Version 3.5 oder höher verwenden, ist die Funktion reload () nicht verfügbar, sodass Sie sie mithilfe der Dekodierung beheben müssen, z
quelle
Für Python 3-Benutzer:
Das Ändern der Codierung von 'ascii' auf 'latin1' funktioniert.
Sie können auch versuchen, die Codierung automatisch zu finden, indem Sie die oberen 10000 Bytes mithilfe des folgenden Snippets lesen:
quelle
Mein Computer hatte das falsche Gebietsschema eingestellt.
Ich habe es zuerst getan
locale.getpreferredencoding(False)
ist die Funktion, die aufgerufen wird,open()
wenn Sie keine Codierung angeben . Die Ausgabe sollte sein'UTF-8'
, aber in diesem Fall handelt es sich um eine Variante von ASCII .Dann habe ich den Befehl bash ausgeführt
locale
und diese Ausgabe erhaltenDaher habe ich das Standard-Ubuntu-Gebietsschema verwendet, wodurch Python Dateien als ASCII anstelle von UTF-8 öffnet. Ich musste mein Gebietsschema auf einstellen
en_US.UTF-8
Wenn Sie das Gebietsschema nicht systemweit ändern können, können Sie Ihren gesamten Python-Code folgendermaßen aufrufen:
oder tun
Um es in der Shell festzulegen, führen Sie es aus.
quelle
Wenn dieses Problem beim Ausführen von certbot beim Erstellen oder Erneuern des Zertifikats auftritt, verwenden Sie die folgende Methode
grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx
Dieser Befehl hat das fehlerhafte Zeichen "´" in einer .conf-Datei im Kommentar gefunden. Nach dem Entfernen (Sie können Kommentare nach Belieben bearbeiten) und dem erneuten Laden von Nginx funktionierte alles wieder.
Quelle: https://github.com/certbot/certbot/issues/5236
quelle
Wenn Sie sich mit Text in Python befassen, wenn es sich um einen Unicode-Text handelt, notieren Sie sich, dass es sich um Unicode handelt.
Setze
text=u'unicode text'
stattdessen einfachtext='unicode text'
.Das hat in meinem Fall funktioniert.
quelle
offen mit Codierung UTF 16 wegen lat und long.
quelle
Es funktioniert, indem nur das Argument 'rb' read binary anstelle von 'r' read verwendet wird
quelle