2011-01-10 6 views
6

Ich habe alle Fragen zur Konvertierung von Unicode zu CSV in Python hier in StackOverflow gelesen und bin immer noch verloren. Jedesmal, wenn ich eine receive "UnicodeEncodeError: 'ASCII' Codec nicht Zeichen kodieren, können u '\ XD1' in Position 12: ordinal nicht im Bereich (128)"Python: Konvertieren von Unicode nach ASCII ohne Fehler für CSV-Datei

buffer=cStringIO.StringIO() 
writer=csv.writer(buffer, csv.excel) 
cr.execute(query, query_param) 
while (1): 
    row = cr.fetchone() 
    writer.writerow([s.encode('ascii','ignore') for s in row]) 

Der Wert von Zeile ist

(56, u"LIMPIADOR BA\xd1O 1'5 L") 

wo der Wert von \ xd10 in der Datenbank ist ñ, ein mit einer diakritischen Tilde in Spanisch verwendet. Zuerst habe ich versucht, den Wert in etwas Ascii zu konvertieren, aber nachdem ich so viel Zeit verloren habe, versuche ich nur, diese Zeichen zu ignorieren (ich nehme an, ich hätte das gleiche Problem mit Akzentvokalen).

Ich möchte den Wert in der CSV speichern, vorzugsweise mit dem ñ ("LIMPIADOR BAÑO 1'5 L"), aber wenn nicht möglich, zumindest in der Lage, es zu speichern ("LIMPIADOR BAO 1'5 L ").

+0

Was ist Ihre Frage? –

+0

Aktualisiert mit Frage am Ende. – Sergi

+1

Warum versuchen Sie nicht, auf Ihrer lokalen Windows-ANSI-Codepage zu codieren? Ich vermute, dass Sie Windows verwenden, da CSV am häufigsten unter Windows verwendet wird, aber ignorieren Sie mich bitte, wenn das weit von der Marke entfernt ist. Auf einem * NIX OS wäre wohl eine der 8 Bit ISO-Kodierungen angebracht, aber ich bin kein Experte. –

Antwort

12

Korrekt, ñ ist kein gültiges ASCII-Zeichen, daher können Sie es nicht in ASCII codieren. Sie können also, wie Ihr Code oben sagt, sie ignorieren. Eine andere Möglichkeit, nämlich die Akzente zu entfernen, finden Sie hier:

Aber beachten Sie, dass beide Techniken zu schlechten Effekten führen können, wie Worte tatsächlich etwas anderes bedeuten, usw. So ist das Beste, um die Akzente zu halten. Und dann können Sie nicht ASCII verwenden, aber Sie können eine andere Codierung verwenden. UTF-8 ist die sichere Wette. Latin-1 oder ISO-88591-1 ist üblich, aber es enthält nur westeuropäische Zeichen. CP-1252 ist üblich unter Windows, etc., etc.

Also einfach "ASCII" für jede Kodierung, die Sie wollen.


Ihr eigentlicher Code, nach Ihrem Kommentar ist:

writer.writerow([s.encode('utf8') if type(s) is unicode else s for s in row]) 

wo

row = (56, u"LIMPIADOR BA\xd1O 1'5 L") 

Nun, ich glaube, das sollte funktionieren, aber anscheinend ist es nicht. Ich glaube Unicode wird sowieso versehentlich in den cvs-writer übernommen. Auszupacken, dass die lange Schlange, um es Teile ist:

col1, col2 = row # Use the names of what is actually there instead 
row = col1, col2.encode('utf8') 
writer.writerow(row) 

Jetzt Ihren wirklichen Fehler wird nicht durch die Tatsache versteckt, dass man alles in der gleichen Linie bleiben. Dies hätte wahrscheinlich auch vermieden werden können, wenn Sie eine ordnungsgemäße Rückverfolgung eingefügt hätten.

+0

Die meisten CSV-Reader können UTF-8 nicht verarbeiten. Da CSV am häufigsten unter Windows gelesen wird, scheint eine der sogenannten ANSI-Kodierungen am geeignetsten zu sein. –

+0

Nun, ich weiß nicht über "die meisten", aber zumindest einige. Und CSV wird überall verwendet. Offensichtlich muss eine Codierung verwendet werden, die von der Zielsoftware gelesen werden kann. –

+0

Die Sache ist, dass der obige Code, der die Unicode-Zeichenkette u "LIMPIADOR BA \ xd1O 1'5 L" verwendet, kläglich mit dem UnicodeEncodeError Fehler versagt, der auch oben ausführlich beschrieben wurde (das "ignorieren" Flag funktioniert nicht, ich weiß nicht warum) .Unter idealen Bedingungen würde ich gerne eine CSV-Datei mit der vollständigen Zeichenfolge einschließlich der ñ erhalten. – Sergi