Python 3 копирует данные как есть с помощью xlrd и xlwt

Я новичок в программировании, изучаю Python3. Жена попросила меня сделать ей скрипт, который будет считывать данные из excel из одного столбца и копировать каждую вторую строку в другой столбец. У нее есть excel из 12 000 строк, и они имеют форму: row1=string, row2=(int/float/date/time), row3=string, row4=(int/float/date/time)...

что я сделал это:

import xlrd
import xlwt

workbook = xlrd.open_workbook("MyExcel.xls")
sheet = workbook.sheet_by_index(0)

wb = xlwt.Workbook()
ws = wb.add_sheet("Sheet1")

i = 0
data = []
for i in range(sheet.nrows):
     if i % 2 == 0:
         value = sheet.cell(i, 0).value
         data.append(value)

j = 0

for j in range(len(data)):
    ws.write(j, 0, data[j])
    j += 1

wb.save("MyOutput.xls")

Он отлично работает, но проблема в том, что он отлично работает со строками и целыми числами, а не с датами или временем, он преобразует их в числа с плавающей запятой. Мне просто нужно скопировать значение каждой ячейки «как есть», без форматирования или чего-то еще, просто скопируйте и вставьте. Если ячейка имеет значение: «monkey/73.0:blah», я просто хочу, чтобы она скопировала ее как «monkey/73.0:blah» в новый Excel.

Есть идеи, как этого добиться?

ps: я знаю, что это может быть достигнуто в самом excel, без использования python (с INDEX и ROWS), но мне любопытно, как передавать данные таким образом, как обычное копирование и вставка, без, например, разделения моих дат на float, если это 01.01.2016.

Спасибо


person Skarga    schedule 21.09.2016    source источник


Ответы (1)


Вы не можете делать именно то, что хотите, потому что не понимаете, что Excel хранит в файле.

Даты и время хранятся в виде значений с плавающей запятой. Значения времени находятся в диапазоне от 0 до 1,0, а значения даты и времени хранятся в виде больших чисел (отрицательные даты обрабатываются неправильно во многих версиях Excel). Вы не можете просто скопировать значения ячейки «как есть» (т. е. без форматирования), потому что форматирование — это единственный способ узнать, что ячейка является датой или временем!

Чтобы прочитать даты и время, вы можете заменить свой блок кода, который создает список data, следующим:

cv = lambda v, t: (v if t != 3 
                     else datetime(*(xlrd.xldate_as_tuple(v, workbook.datemode))))
data = [ cv(sheet.cell(i, 0).value, sheet.cell_type(i, 0))
         for i in range(1, sheet.nrows, 2) ]

Это даст вам список объектов string, float и datetime, которые вы можете записать в свой выходной файл (запись дат с использованием xlrw оставлена ​​в качестве упражнения для читателя, потому что я этого не делал, и уже поздно здесь и сейчас).

person cco    schedule 22.09.2016