Iteration über eine Reihe von Zeilen mit ws.iter_rows in der optimierten Leser von openpyxl

Ich muss eine xlsx-Datei von 10×5324 Zellen lesen

Das ist der Kern dessen, was ich versuchte zu tun:

from openpyxl import load_workbook filename = 'file_path' wb = load_workbook(filename) ws = wb.get_sheet_by_name('LOG') col = {'Time':0 ...} for i in ws.columns[col['Time']][1:]: print i.value.hour 

Der Code dauert viel zu lange, um zu laufen, dann sollte es (ich war Operationen, nicht drucken) und nach einer Weile wurde ich ungeduldig und storniert es.

Irgendeine Idee, wie ich es im optimierten Leser bearbeiten kann? Ich muss über eine Reihe von Zeilen iterieren, nicht über alle Zeilen. Dies ist, was ich versuchte, aber es ist falsch:

 wb = load_workbook(filename, use_iterators = True) ws = wb.get_sheet_by_name('LOG') for i in ws.iter_rows[1:]: print i[col['Time']].value.hour 

Gibt es irgendwie kann ich es ohne die Reichweite funktionieren?

Ich denke, ein Weg, es zu tun wäre:

 for i in ws.iter_rows[1:]: if i.row == startrow: continue print i[col['Time']].value.hour if i.row == endrow: break 

Aber gibt es eine elegantere Lösung? (Das funktioniert auch nicht btw)

2 Solutions collect form web for “Iteration über eine Reihe von Zeilen mit ws.iter_rows in der optimierten Leser von openpyxl”

Die einfachste Lösung mit einer unteren Grenze wäre so etwas wie folgt:

 # Your code: from openpyxl import load_workbook filename = 'file_path' wb = load_workbook(filename, use_iterators=True) ws = wb.get_sheet_by_name('LOG') # Solution 1: for row in ws.iter_rows(row_offset=1): # code to execute per row... 

Hier eine andere Möglichkeit, das, was du beschreibst, mit der enumerate auszuführen:

 # Solution 2: start, stop = 1, 100 # This will allow you to set a lower and upper limit for index, row in enumerate(ws.iter_rows()): if start < index < stop: # code to execute per row... 

Die Indexvariable beherrscht, in welcher Zeile du eingeschaltet bist, also kann sie anstelle von Reichweite oder Xrange verwendet werden. Diese Methode ist ziemlich einfach und arbeitet mit Iteratoren im Gegensatz zu Reichweite oder Slicing, und kann mit nur die untere Grenze verwendet werden, wenn gewünscht. Prost!

Aus der Dokumentation :

Hinweis: Wenn ein Arbeitsblatt im Speicher erstellt wird, enthält es keine Zellen. Sie werden beim ersten Zugriff erstellt. Auf diese Weise erstellen wir keine Objekte, auf die niemals zugegriffen wird, wodurch der Speicherbedarf reduziert wird.

Warnung: Wegen dieser Funktion, das Scrollen durch Zellen anstatt sie direkt zuzugreifen, werden sie alle im Gedächtnis erstellen, auch wenn Sie ihnen keinen Wert zuweisen. Etwas wie

 >>> for i in xrange(0,100): ... for j in xrange(0,100): ... ws.cell(row = i, column = j) 

Wird 100×100 Zellen im Gedächtnis erstellen, für nichts.

Allerdings gibt es einen Weg, um alle diese unerwünschten Zellen zu reinigen, das werden wir später sehen.

Ich denke, der Zugriff auf die Spalten oder Zeilen Eigenschaften wird dazu führen, dass viele Zellen in den Speicher geladen werden müssen. Ich würde vorschlagen, nur versuchen, direkt auf die Zellen, die Sie benötigen.

z.B.

 col_name = 'A' start_row = 1 end_row = 99 range_expr = "{col}{start_row}:{col}{end_row}".format( col=col_name, start_row=start_row, end_row=end_row) for (time_cell,) in ws.iter_rows(range_string=range_expr): print time_cell.value.hour 
  • Csv & xlsx Dateien importieren in pandas data frame: speed issue
  • Wie kann ich die Formeln einer Excel-Kalkulationstabelle in Pandas / Python sehen?
  • Serving Excel (xlsx) Datei an den Benutzer zum Download in Django (Python)
  • Python ist die beste Programmiersprache der Welt.