Я пытаюсь создать текстовый файл в формате csv из PyQt4 QTableWidget
. Я хочу написать текст в кодировке UTF-8, потому что он содержит специальные символы. Я использую следующий код:
import codecs
...
myfile = codecs.open(filename, 'w','utf-8')
...
f = result.table.item(i,c).text()
myfile.write(f+";")
Это работает до тех пор, пока в ячейке не будет специального символа. Я пробовал также с
myfile = open(filename, 'w')
...
f = unicode(result.table.item(i,c).text(), "utf-8")
Но он также останавливается, когда появляется специальный символ. Понятия не имею, что делаю не так.
myfile.write(u"%s"&f+";")
Ответы:
Из вашей оболочки запустите:
И ( в отличие от первоначального вопроса) предполагая , что вы используете Python, встроенный в
csv
модуль, поворотimport csv
вimport unicodecsv as csv
в коде.источник
writer = csv.writer(out, dialect='excel', encoding='utf-8')
и создать обработчик файлов с помощьюopen(...
, notcodecs.open(...
.Для Python 3.x это очень просто ( документы ).
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')
Для Python 2.x смотрите здесь .
источник
writerow
не является UTF-8? это будет работать?Используйте этот пакет, он просто работает: https://github.com/jdunck/python-unicodecsv .
источник
Для меня
UnicodeWriter
класс из документации модуля Python 2 CSV на самом деле не работал, поскольку он нарушаетcsv.writer.write_row()
интерфейс.Например:
csv_writer = csv.writer(csv_file) row = ['The meaning', 42] csv_writer.writerow(row)
работает, пока:
csv_writer = UnicodeWriter(csv_file) row = ['The meaning', 42] csv_writer.writerow(row)
выкину
AttributeError: 'int' object has no attribute 'encode'
.Поскольку,
UnicodeWriter
очевидно, ожидается, что все значения столбцов будут строками, мы можем преобразовать значения сами и просто использовать модуль CSV по умолчанию:def to_utf8(lst): return [unicode(elem).encode('utf-8') for elem in lst] ... csv_writer.writerow(to_utf8(row))
Или мы можем даже заплатить csv_writer, чтобы добавить
write_utf8_row
функцию - это упражнение предоставляется читателю.источник
Примеры в документации Python показывают, как писать файлы Unicode CSV: http://docs.python.org/2/library/csv.html#examples
(здесь нельзя скопировать код, потому что он защищен авторским правом)
источник
Для python2 вы можете использовать этот код до этого.
csv_writer.writerows(rows)
Этот код НЕ будет преобразовывать целые числа в строки utf-8.
источник
Очень простой прием - использовать импорт json вместо csv. Например, вместо csv.writer просто сделайте следующее:
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()
В основном, учитывая список полей в правильном порядке, строка в формате json идентична строке csv, за исключением [и] в начале и в конце соответственно. И json кажется устойчивым к utf-8 в python 2. *
источник