2016-05-26 11 views
-1

Ich arbeite an einem ziemlich großen Programm, das Daten von wieder nimmt, eine ziemlich große Excel-Tabelle. Aus irgendeinem seltsamen Grund dauert es ewig, diese große Excel-Datei zu laden, und ich hoffte, sie irgendwie zu beschleunigen. Ich habe selbst recherchiert und read_only versucht, aber das hat mir nicht erlaubt, irgendwelche Zellen zu lesen (zumindest wie unten gezeigt). Irgendwelche Vorschläge wären sehr willkommen.Speed ​​uppyxl lesen

def LoadSheet(Filename,worksheet_nr): 
    import time as t 
    st = t.clock() 
    wb = xl.load_workbook(str(Filename))#workbook, loading workbook 
    Sheets = wb.get_sheet_names()#Worksheets, shows all sheets in the workbook loaded 
    ActiveSheet = wb.get_sheet_by_name(Sheets[worksheet_nr])#Selects the first sheet 
    print round(t.clock() - st,3), "seconds of loading time." 
    print "Sheet is loaded and reading..." 
    return ActiveSheet 



def CountRC_nr(ActiveSheet, StartR,StartC): 
    R = StartR#Selected starting Row number 
    C = StartC#Selected starting Column number 
    Val = None #Value in cell (Right now, none is selected, thus zero value) 
    while (Val != "None"): 
     Val = str(ActiveSheet.cell(row=R,column=C).value) 
     R += 1 

    NumberRows = R - StartR - 1 
    Val = None 
    R=StartR 

    while (Val != "None"): 
     Val = str(ActiveSheet.cell(row=R,column=C).value) 
     C += 1 
    NumberColumns = C - StartC - 1 

    return NumberRows, NumberColumns 

Da einige von Ihnen angeforderte zu sehen, wie ich verwendet read_only, hier den geänderten Code:

def LoadSheet(Filename,worksheet_nr): 
    import time as t 
    st = t.clock() 
    wb = xl.load_workbook(str(Filename), read_only = True)#workbook, loading workbook 
    Sheets = wb.get_sheet_names()#Worksheets, shows all sheets in the workbook loaded 
    ActiveSheet = wb.get_sheet_by_name(Sheets[worksheet_nr])#Selects the first sheet 
    print round(t.clock() - st,3), "seconds of loading time." 
    print "Sheet is loaded and reading..." 
    return ActiveSheet 



def CountRC_nr(ActiveSheet, StartR,StartC): 
    R = StartR#Selected starting Row number 
    C = StartC#Selected starting Column number 
    Val = None #Value in cell (Right now, none is selected, thus zero value) 
    while (Val != "None"): 
     Val = str(ActiveSheet.cell(row=R,column=C).value) 
     R += 1 

    NumberRows = R - StartR - 1 
    Val = None 
    R=StartR 

    while (Val != "None"): 
     Val = str(ActiveSheet.cell(row=R,column=C).value) 
     C += 1 
    NumberColumns = C - StartC - 1 

    return NumberRows, NumberColumns 
+0

Es wäre besser, sich auf die Probleme mit schreibgeschütztem Modus zu konzentrieren. Ihr Code scheint auch gegen die openpyx API zu arbeiten. –

+0

Charlie, tut mir leid, ich habe nicht verstanden, was du meinst. Was meinst du gegen openpixl API? Alles funktioniert korrekt und alles, was ich mir wünschte, war, es zu beschleunigen, aber alle Möglichkeiten, die ich versuche zu arbeiten. Wenn Sie es besser wissen, lassen Sie es mich wissen. – user3604362

+0

Bitte geben Sie einen aktuellen Beispielcode im Read-Only-Modus an (verwenden Sie 'ws.cell()' nicht hier). –

Antwort

1

Wie ich bereits gesagt habe, sind Sie gegen die API arbeiten. Wenn die Dimension des Arbeitsblatts bekannt ist, dann können Sie auf sie zugreifen, sonst können Sie Ihre eigenen Zähler erstellen, es gibt wenig Sinn.

Read-only-Modus ist sehr schnell für einzelne Abfragen, sondern als jeder Lookup alle Zellen in den Zeilen bis zu dem von Interesse beinhaltet das Parsen es sehr ineffizient für viele von ihnen ist, wie Sie Ihr Code verwendet.

wb = load_workbook(filename, read_only=True) 
for ws in wb: 
    print(ws.dimensions) 
    for row in ws.rows: 
     for cell in row: 
      print(cell.value) # do whatever you want with the cell 

Sie können ganz einfach Zeilen in NumPy Arrays konvertieren (cell.value for cell in row) verwenden, aber die Pandas Bibliothek werden auch Arbeitsblätter direkt in Datenrahmen gelesen.