Ответ 1
От запуска оболочки:
pip2 install unicodecsv
И (в отличие от исходного вопроса), предполагая, что вы используете Python, встроенный в модуль csv
, перейдите import csv
в import unicodecsv as 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")
Но он также останавливается, когда появляется специальный символ. Я понятия не имею, что я делаю неправильно.
От запуска оболочки:
pip2 install unicodecsv
И (в отличие от исходного вопроса), предполагая, что вы используете Python, встроенный в модуль csv
, перейдите import csv
в import unicodecsv as csv
в вашем коде.
Это очень просто для 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 посмотрите здесь.
Используйте этот пакет, он просто работает: https://github.com/jdunck/python-unicodecsv.
В примерах документации Python показано, как писать файлы CSV Unicode: http://docs.python.org/2/library/csv.html#examples
(здесь не копируется код, потому что он защищен авторским правом)
Для меня класс 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
- упражнение осталось для читателя.
Для 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
Очень простой взлом - использовать 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. *