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
csv
módulo, a su vez,import csv
enimport unicodecsv as csv
su 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
writerow
no es un utf-8? ¿Funcionará?Use este paquete, simplemente funciona: https://github.com/jdunck/python-unicodecsv .
fuente
Para mí, la
UnicodeWriter
clase 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
UnicodeWriter
obviamente 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_row
funció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
fuente
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