Задать вопрос
@89109983838

Почему xlwt несохряняет полностью файл при наличии русских букв?

Добрый день!
Подскажите куда "копать", суть проблемы вот в чем:
С помощью xlrd и xlwt пытаюсь обработать небольшой прайс лист 1500 строк! - но в конечном фале появляется только первые 130 - 200 строк, но чаще вообще ничего.
А при открытии конечного фала new_price.xls EXCEL-ем выдает сообщение "В книге "new_price.xls" обнаружено содержимое, которое не удалось почитать. Попробовать восстановить содержимое книги? Если доверяете источнику этой книги, нажмите кнопку Да"
Если же открыть через OpenOffice Calc = то после выше указанных 130-250 (каждый раз по разному) в строке с названием идет "наборы всяких значков и символов" и далее в артикуле!
Если отключить вывод в прайс названия (ws.write(num,1,v[0])) то все нормально - и артикул и цены на месте, и EXCEL не ругается при открытии.
Если обрабатывать строк 150 - 200 то проблем тоже нет с русскими буквами!
Если заменить все названия в исходном файле текстом чисто на русского языке - то проблем тоже не возникает! т.к. в оригинале в названиях и русские и английские слова (+ цифры, скобки, кавычки, и т.д. н они не влияют на проблему)

Вот упрощенный код:
#-*- coding: utf8 -*-
import xlrd, xlwt
import os
from trans import transliterate  # самописная функция транслитерации 
                                                  # благодаря ей понял что дело 
                                                  # не в спец. символах, а Русских символах!
file = '01.xls'     # исходный файл EXCEL
art = 0              # столбец с Артикулом
names = 1        # столбец с Названием товара
price = 2          # столбец с Цена товара
data = {}           # Словарь в него записываются данные для обработки 
                        # в формате {'Артикул':('Название', 'Цена')}
n = 0
directory = os.getcwd() # Определяем текущий путь

mybook = xlrd.open_workbook (directory + '\\' + file, on_demand=True) #encoding_override='utf8' # пробовал разные кодировки не помогает
list = mybook.sheet_names()[0]
sheet = mybook.sheet_by_name(list)
for s in range(sheet.nrows):
    if sheet.row_values(s)[names] == '': # Проверяем что в names и приводим к строке
        name = 'нет имени'
    else:
        if type(sheet.row_values(s)[names]) is str:
            name = sheet.row_values(s)[names]
        else:
            name = str(int(sheet.row_values(s)[names]))
    name = transliterate(name)   # обработал name через транслитерацию и понял что дело в русских буквах!!!
# для нижнего скрина в транслитерации "выключил" замену буквы б, 
# при полной замене всех русских символов английскими конечный прайс открывается нормально!

    data[str(int(sheet.row_values(s)[art]))] = (name, sheet.row_values(s)[price])  # Заполняем словарь с вложенным кортежем
    n = +=1    

mybook.release_resources() # после обработки выгружаем ресурсы -> '01.xls'

wb = xlwt.Workbook() #encoding='utf8'   # пробовал разные кодировки не помогает
ws = wb.add_sheet('Test')   #,cell_overwrite_ok=True)
   
num = 1
for k,v in data.items():
    nums = num
    k = k.replace(' ','')
    ws.write(num,0,k)
    ws.write(num,1,v[0])   # <- вот ТУТ чтото не так
    print (v[0])           # хотя печатает все 1500 позиций в консоли на родном русском, когда отключена транслитерация!
    ws.write(num,2,v[1])
    num += 1
ws.write(1501,1,'ПРИВЕТ')  # при наличии русских букв в словаре этой надписи в конечном файле (new_price.xls) нет!
wb.save('new_price.xls')   # сохраняем конечный результат
print ('ГОТОВО!')


Вот скрин что тварится в OpenOffice Calc при открытии - из-за наличия одной только буквы русской 'б' в конечном прайсе, в столбец с Артикулами (первый) влитают все последующие названия, цены самое интересное остаются как надо (видно по тому что они в float)
Обратите внимание на 214 строку в ней в названии turбonasadka отображает корректно букву б
bc85737a7ebd4ed18c63bd136a373210.jpg

Вот еще скрин (без использования транслитерации):
впечатление такое что "словарь" data сходит с ума....

b0f8454db9b84ce180ecead31a295348.jpg
  • Вопрос задан
  • 497 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@89109983838 Автор вопроса
Решение проблемы для версии python 3 это переход с xlwt на xlwt3 - тогда проблем нет с кодировками кириллицы!

Только после установки xlwt3 если выходит ошибка:
alueError: '__init__' in __slots__ conflicts with class variable

Закоментируйте функцию __init__ в .........lib\site-packages\xlwt3\formula.py
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
посмотрите тут и тут

попробуйте альтернативы

ну и классику проверьте по очистке символов 1, 2, 3
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы