Найти - Пользователи
Полная версия: работа с xls из python 3
Начало » Python для экспертов » работа с xls из python 3
1
vOROn200
Возникла необходимость сгенерировать файл xls из csv не думал, что возникнут такие проблемы. Делаю через xlwt :
данные в файле csv находятся в кодировке cp1251.

import csv, xlwt
with open('outlets.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='"')
    wbk= xlwt.Workbook()
    sheet = wbk.add_sheet('Sheet1')
    for rowi, row in enumerate(reader):
        for coli, value in enumerate(row):
            sheet.write(rowi, coli, value)
wbk.save('out.xls')

На выборке из 200 записей содержащих кириллицу имею очень странное поведение:
http://prntscr.com/9fdqga
Часть строк 86-100 и 186-200 оказываются битыми.

Как не допустить этого?

На python2 такого не наблюдается:
import csv, xlwt
with open('outlets.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='"')
    wbk= xlwt.Workbook()
    sheet = wbk.add_sheet(u'Sheet1')
    for rowi, row in enumerate(reader):
        for coli, value in enumerate(row):
            value = value.decode('cp1251')
            sheet.write(rowi, coli, value)
wbk.save('out.xls')

Работает нормально.

Архив с данными и исходниками
doza_and
на первый взгляд напрашивается сразу задать кодировку файла при открывании
open('outlets.csv',encoding="cp1251")
vOROn200
увы, с encoding код тоже приводит к аналогичному результату

import csv, xlwt
with open('outlets.csv', encoding="cp1251") as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='"')
    wbk= xlwt.Workbook()
    sheet = wbk.add_sheet('Sheet1')
    for rowi, row in enumerate(reader):
        for coli, value in enumerate(row):
            sheet.write(rowi, coli, value)
wbk.save('out.xls')

в дебаггере вижу, что value в python 3 - str , в python 2 , после .decode('cp1251') - unicode . Поидее ж должны быть равнозначны. Но в python 3 - не работает.

Использовал:
Python 3.5.1 (windows 7-10)
Python 2.7.11 (windows 7-10)
4kpt_III
sheet = wbk.add_sheet(u'Sheet1')

python3? realy?

P.S. xls не есть гуд. Лучше xlsx.
P.P.S. Киньте файл, попробуем и мы
vOROn200
4kpt_III
python3? realy?
упс.. очепятался. поправил в сообщении

C xlsx проблем не возникает, а тут понадобилось именно с xls поработать.

Ссылка на код с данными:
Код с примером и данными
vOROn200
Попробывал перевести данные в utf8 с cp1251 результат такой же:

Код и данные в utf8 с bom и без

import csv, xlwt
 
with open('outlets-utf8.csv', encoding="utf8") as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='"')
    wbk= xlwt.Workbook()
    sheet = wbk.add_sheet('Sheet1')
    for rowi, row in enumerate(reader):
        for coli, value in enumerate(row):
            sheet.write(rowi, coli, value)
wbk.save('out.xls')
py.user.next
Это какой-то внутренний глюк xlwt.
Там записи, которые ломаются, можно вынести в отдельный файл - и они пишутся нормально, а если вместе собрать - пишутся ненормально.
pyuser
vOROn200, возьмите старый пакет xlwt3, с ним работает.
Только надо в седьмой строке файла formula.py удалить “__init__” из __slots__.
Vigi
У меня вот так все работает:
 import csv
import xlwt
with open('outlets.csv', encoding="windows-1251") as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='"')
    wbk = xlwt.Workbook()
    sheet = wbk.add_sheet('Sheet1')
    for rowi, row in enumerate(reader):
        for coli, value in enumerate(row):
            sheet.write(rowi, coli, value)
wbk.save('out.xls')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB