Estoy tratando de crear un archivo de texto en formato csv a partir de PyQt4 QTableWidget. Quiero escribir el texto con 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. Probé 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.

myfile.write(u"%s"&f+";")Respuestas:
Desde su shell ejecutar:
Y (a diferencia de la pregunta original) suponiendo que está utilizando Python construido en el
csvmódulo, a su vez,import csvenimport unicodecsv as csvsu código.fuente
writer = csv.writer(out, dialect='excel', encoding='utf-8')y crear el controlador de archivos conopen(..., nocodecs.open(....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 aquí .
fuente
writerowno es un utf-8? ¿Funcionará?Use este paquete, simplemente funciona: https://github.com/jdunck/python-unicodecsv .
fuente
Para mí, la
UnicodeWriterclase de la documentación del módulo CSV de Python 2 realmente no funcionó ya que rompe lacsv.writer.write_row()interfaz.Por ejemplo:
csv_writer = csv.writer(csv_file) row = ['The meaning', 42] csv_writer.writerow(row)funciona, mientras que:
csv_writer = UnicodeWriter(csv_file) row = ['The meaning', 42] csv_writer.writerow(row)arrojará
AttributeError: 'int' object has no attribute 'encode'.Como
UnicodeWriterobviamente espera que todos los valores de columna sean cadenas, podemos convertir los valores nosotros mismos y simplemente 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 incluso podemos modificar csv_writer para agregar una
write_utf8_rowfunción; el ejercicio queda en manos del lector.fuente
Los ejemplos de 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)
fuente
Para python2 , puede usar este código antes.
csv_writer.writerows(rows)Este código NO convertirá enteros en cadenas utf-8
def encode_rows_to_utf8 (filas): encoded_rows = [] para fila en filas: encoded_row = [] por valor en fila: if isinstance (valor, cadena base): valor = unicode (valor) .encode ("utf-8") encoded_row.append (valor) encoded_rows.append (encoded_row) return encoded_rowsfuente
Un truco muy simple es usar la importación json en lugar de csv. Por ejemplo, en lugar de csv.writer, haga 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 con formato json es idéntica a una línea csv excepto por [y] al principio y al final respectivamente. Y json parece ser robusto para utf-8 en python 2. *
fuente