Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2015 21:12:47

vOROn200
Зарегистрирован: 2015-12-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

работа с xls из python 3

Возникла необходимость сгенерировать файл 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')

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

Архив с данными и исходниками

Отредактировано vOROn200 (Дек. 17, 2015 23:07:04)

Офлайн

#2 Дек. 17, 2015 22:17:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

работа с xls из python 3

на первый взгляд напрашивается сразу задать кодировку файла при открывании

open('outlets.csv',encoding="cp1251")



Офлайн

#3 Дек. 17, 2015 22:52:13

vOROn200
Зарегистрирован: 2015-12-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

работа с xls из python 3

увы, с 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)

Отредактировано vOROn200 (Дек. 17, 2015 23:08:26)

Офлайн

#4 Дек. 17, 2015 22:56:35

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

работа с xls из python 3

sheet = wbk.add_sheet(u'Sheet1')

python3? realy?

P.S. xls не есть гуд. Лучше xlsx.
P.P.S. Киньте файл, попробуем и мы

Отредактировано 4kpt_III (Дек. 17, 2015 22:57:37)

Офлайн

#5 Дек. 17, 2015 23:06:04

vOROn200
Зарегистрирован: 2015-12-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

работа с xls из python 3

4kpt_III
python3? realy?
упс.. очепятался. поправил в сообщении

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

Ссылка на код с данными:
Код с примером и данными

Отредактировано vOROn200 (Дек. 17, 2015 23:08:10)

Офлайн

#6 Дек. 17, 2015 23:25:20

vOROn200
Зарегистрирован: 2015-12-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

работа с xls из python 3

Попробывал перевести данные в 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')

Офлайн

#7 Дек. 18, 2015 02:17:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9715
Репутация: +  842  -
Профиль   Отправить e-mail  

работа с xls из python 3

Это какой-то внутренний глюк xlwt.
Там записи, которые ломаются, можно вынести в отдельный файл - и они пишутся нормально, а если вместе собрать - пишутся ненормально.



Отредактировано py.user.next (Дек. 18, 2015 02:22:51)

Офлайн

#8 Дек. 18, 2015 05:53:01

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

работа с xls из python 3

vOROn200, возьмите старый пакет xlwt3, с ним работает.
Только надо в седьмой строке файла formula.py удалить “__init__” из __slots__.



Офлайн

#9 Июль 27, 2018 04:52:16

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

работа с xls из python 3

У меня вот так все работает:

 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')

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version