Подтвердить что ты не робот

Как написать UTF-8 в файле CSV

Я пытаюсь создать текстовый файл в формате 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")

Но он также останавливается, когда появляется специальный символ. Я понятия не имею, что я делаю неправильно.

4b9b3361

Ответ 1

От запуска оболочки:

pip2 install unicodecsv

И (в отличие от исходного вопроса), предполагая, что вы используете Python, встроенный в модуль csv, перейдите
import csv в
import unicodecsv as csv в вашем коде.

Ответ 2

Это очень просто для 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')

Для Python 2.x посмотрите здесь.

Ответ 4

В примерах документации Python показано, как писать файлы CSV Unicode: http://docs.python.org/2/library/csv.html#examples

(здесь не копируется код, потому что он защищен авторским правом)

Ответ 5

Для меня класс UnicodeWriter из документации модуля CSV Python 2 действительно не работал, поскольку он разбивает интерфейс 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))

Или мы можем даже monkey-patch csv_writer добавить функцию write_utf8_row - упражнение осталось для читателя.

Ответ 6

Для python2 вы можете использовать этот код до csv_writer.writerows(rows)
Этот код НЕ будет преобразовывать целые числа в строки utf-8

def encode_rows_to_utf8(rows):
    encoded_rows = []
    for row in rows:
        encoded_row = []
        for value in row:
            if isinstance(value, basestring):
                value = unicode(value).encode("utf-8")
            encoded_row.append(value)
        encoded_rows.append(encoded_row)
    return encoded_rows

Ответ 7

Очень простой взлом - использовать json import вместо 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. *