Я работаю над чтением из файла dbf произвольной кодировки.
filename = request.FILES['file']
file_in_memory = StringIO(filename.read())
zip_file = ZipFile(file_in_memory, 'r')
clouddbf = StringIO(zip_file.read(name, 'rb'))
file_import = sh.Reader(dbf=clouddbf)
fields = file_import.fields
>>> fields
[('DeletionFlag', 'C', 1, 0), ['id', 'C', 50, 0], ['\xc8\xed\xe8\xf6\xe8\xe0\xf2\xee\xf0_', 'C', 254, 0], ['\xc3\xee\xe4_\xe2\xe2\xee\xe4\xe0_', 'C', 254, 0]]
В таблице содержится кириллица, и когда я пытаюсь вывести на экран заголовок столбца (столбец называется Инициатор_), сталкиваюсь со странной проблемой.
>>> print chardet.detect(fields[i+1][0])['encoding']
MacCyrillic
>>> print fields[i+1][0]
╚эшЎшрЄюЁ_ # здесь кодировка cp866 (кодировка командной строки)
>>> print file_import.fields[i+1][0].decode('cp1251')
Инициатор_
>>> print fields[i+1][0].decode(chardet.detect(fields[i+1][0])['encoding'], errors='ignore')
Python27\Lib\encodings\cp866.py in encode
12. return codecs.charmap_encode(input,errors,encoding_map)
Exception Value: 'charmap' codec can't encode character u'\xbb' in position 0: character maps to <undefined>
В документации сказано, что если errors='ignore', то ошибочные символы пропускаются, а не приводят к ошибке.
Вопрос: почему выходит ошибка?
fields[i+1][0]имеет типunicode, то его в принципе нельзя декодировать, потому что он уже и так декодирован в юникод :) Кого, откуда и как вы читаете то, что у вас получается в переменнойfields[i+1][0]? – andreymal Dec 27 '16 at 12:53filenameтоже напишите — важно всё. – andreymal Dec 27 '16 at 13:03encodingне поможет найти. В чём вы видите ошибку сerrors="ignore"? Напишите в форме: «Y = X.decode(encoding, errors='ignores')получаю Y, а хочуZ(покажитеprint repr(X), repr(Y), repr(Z))». – jfs Dec 27 '16 at 13:47