python - with - Cómo escribir UTF-8 en un archivo CSV
python with open encoding utf 8 (6)
Intento crear un archivo de texto en formato csv de un PyQt4 QTableWidget
. Quiero escribir el texto con una codificación UTF-8 porque contiene caracteres especiales. Yo uso el siguiente código:
import codecs
...
myfile = codecs.open(filename, ''w'',''utf-8'')
...
f = result.table.item(i,c).text()
myfile.write(f+";")
Funciona hasta que la celda contiene un carácter especial. Lo intenté también con
myfile = open(filename, ''w'')
...
f = unicode(result.table.item(i,c).text(), "utf-8")
Pero también se detiene cuando aparece un personaje especial. No tengo idea de lo que estoy haciendo mal.
Desde tu shell run:
pip2 install unicodecsv
Y (a diferencia de la pregunta original) presumiendo que estás usando el módulo csv
integrado de Python, csv
import csv
a
import unicodecsv as csv
en su código.
Los ejemplos en la documentación de Python muestran cómo escribir archivos CSV Unicode: http://docs.python.org/2/library/csv.html#examples
(no se puede copiar el código aquí porque está protegido por derechos de autor)
Para mí, la clase UnicodeWriter
de la documentación del módulo Python 2 CSV realmente no funcionaba, ya que rompe la interfaz csv.writer.write_row()
.
Por ejemplo:
csv_writer = csv.writer(csv_file)
row = [''The meaning'', 42]
csv_writer.writerow(row)
funciona, mientras:
csv_writer = UnicodeWriter(csv_file)
row = [''The meaning'', 42]
csv_writer.writerow(row)
lanzará AttributeError: ''int'' object has no attribute ''encode''
.
Como UnicodeWriter
obviamente espera que todos los valores de columna sean cadenas, podemos convertir los valores nosotros mismos y solo usar el módulo CSV predeterminado:
def to_utf8(lst):
return [unicode(elem).encode(''utf-8'') for elem in lst]
...
csv_writer.writerow(to_utf8(row))
O podemos incluso aplicar un parche a csv_writer para agregar una función write_utf8_row
; el ejercicio se deja al lector.
Un truco muy simple es usar la importación json en lugar de csv. Por ejemplo, en lugar de csv.writer solo haz lo siguiente:
fd = codecs.open(tempfilename, ''wb'', ''utf-8'')
for c in whatever :
fd.write( json.dumps(c) [1:-1] ) # json dumps writes ["a",..]
fd.write(''/n'')
fd.close()
Básicamente, dada la lista de campos en el orden correcto, la cadena json formateada es idéntica a una línea csv excepto [y] al inicio y al final, respectivamente. Y json parece ser robusto para utf-8 en python 2. *
Use este paquete, simplemente funciona: https://github.com/jdunck/python-unicodecsv .