write with utf8 open leer python csv encoding utf-8 pyqt4

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.


Es muy simple para Python 3.x ( docs ).

import csv with open(''output_file_name'', ''w'', newline='''', encoding=''utf-8'') as csv_file: writer = csv.writer(csv_file, delimiter='';'') writer.writerow(''my_utf8_string'')

Para Python 2.x, mira here .



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. *