2016-09-21 2 views
0

Ich bin neu in der Programmierung, lehre mich Python3. Frau bat mich, ihr ein Skript zu machen, das Daten von Excel aus einer Spalte liest und jede zweite Zeile in eine andere Spalte kopiert. Sie hat eine Excel von 12k Zeilen und es ist in Form von: row1 = string, row2 = (int/float/Datum/Uhrzeit), row3 = string, row4 = (int/Float/Datum/Uhrzeit) ...Python 3 kopieren Daten wie mit xlrd und xlwt

was ich getan habe, ist dies:

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

es funktioniert gut, aber das Problem ist, dass es mit Streichern und ganzen Zahlen, nicht mit Daten oder Zeit, wandelt diese in Schwimmern gut funktioniert. Ich brauche es nur, um den Wert jeder Zelle zu kopieren "wie es ist" keine Formatierung oder irgendetwas, einfach kopieren einfügen. Wenn eine Zelle einen Wert von "affe/73.0: blah" hat, möchte ich nur, dass sie es als "affe/73.0: blah" in das neue Excel kopiert.

Irgendeine Idee, wie man das erreicht?

ps: Ich weiß, dass es innerhalb von Excel selbst ohne Python (mit INDEX und ROWS) erreicht werden kann, aber ich bin neugierig, wie Sie Daten auf diese Weise als normale Kopie einfügen, ohne sie zum Beispiel zu teilen meine Daten in einen Float wenn sein 1/1/2016.

Thx

Antwort

0

Sie können nicht genau das tun, was Sie wollen, weil Sie in der Datei was Excel speichert nicht verstehen.

Datum und Uhrzeit werden als Fließkommawerte gespeichert. Zeitwerte liegen zwischen 0 und 1.0 und Datum/Uhrzeit-Werte werden als größere Zahlen gespeichert (negative Daten werden von vielen Versionen von Excel nicht korrekt behandelt). Sie können nicht einfach die Zellwerte "wie besehen" kopieren (d. H. Ohne Formatierung), da die Formatierung der einzige Weg ist, eine Zelle als Datum oder Uhrzeit zu kennen!

die Termine & mal zu lesen, könnten Sie Ihre Code-Block ersetzen, der die data Liste mit dieser baut:

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

Dies wird Ihnen eine Liste von String, float und Datetime-Objekte, die Sie schreiben können zu Ihrer Ausgabedatei (das Schreiben von Daten mit xlrw bleibt als Übung für den Leser übrig, weil ich es nicht getan habe, und es ist spät hier & jetzt).

Verwandte Themen