2016-04-13 10 views
2

Ich habe hier ein paar Fragen gelesen über das Lesen großer Excel-Dateien mit openpyxl und dem Parameter read_only in load_workbook(), und ich habe es erfolgreich mit Source excels getan 50x30, aber wenn ich versuche, es in einer Arbeitsmappe mit einem 30x1100-Blatt zu tun, wird es stagnieren. Im Moment liest es einfach das Excel ein und überträgt es in ein mehrdimensionales Array.Lesen von 300k Zellen in Excel mit read_only in openpyxl nicht genug

from openpyxl import Workbook 
from openpyxl import load_workbook 


def transferCols(refws,mx,refCol,newCol,header): 
    rmax = refws.max_row 

    for r in range(1, rmax+1): 
     if (r == 1): 
      mx[r-1][newCol-1] = header 
     else: 
      mx[r-1][newCol-1] = refws.cell(row = r, column = refCol).value 


    return 

ref_wb = load_workbook("UESfull.xlsx", read_only= True) 
ref_ws = ref_wb.active 
rmax = ref_ws.max_row 

matrix = [["fill" for col in range(30)] for row in range(rmax)] 
print("step ", 1) 
transferCols(ref_ws,matrix,1,1,"URL") 
... 

Ich habe nur die print („Schritt“), um den Fortschritt zu verfolgen, aber überraschend, stirbt ab er bei Schritt 1! Ich weiß nur nicht, ob die Struktur schlecht ist oder ob 300k Zellen zu viel für openpyx sind. Ich habe noch nicht einmal angefangen, zu meinem Put-Excel zu schreiben! Danke im Voraus!

+0

Gibt es auch etwas nicht gedruckt werden, wenn Sie das [Grund Nur-Lese-Beispiel] verwenden (https://openpyxl.readthedocs.org/en/default/optimized.html) aus den Dokumenten? Wenn es sich um ein einfaches 2D-Blatt handelt, würde ich es wahrscheinlich als CSV-Datei in Microsoft Office speichern und Zeile für Zeile in Python lesen. – jDo

+0

Was beabsichtigen Sie nach dem Lesen mit den Daten? Sie können eine Lösung mit 'Pandas' haben – Abbas

+0

Hallo @Abbas, danke für das Engagement! Ich bin hier wirklich festgefahren. Ich muss ein großes 2D-Excel-Blatt einlesen, die Daten so bereinigen, dass alle Einträge ein einheitliches Format haben, und sie dann speichern. Ziemlich einfach, aber ressourcenintensiv? Der Folgecode ist nur mehrere Aufrufe von transferCols(). Ich dachte, das Excel zu lesen und es in einer lokalen 2D Matrix zu speichern, während ich es bearbeite, bevor ich es in Excel schreibe, wäre schneller. – Philong

Antwort

0

Ich vermute, dass Sie ein undimensioned Arbeitsblatt haben, so dass ws.max_row unbekannt ist. Wenn dies der Fall ist, verwenden Sie ws.calculate_dimensions() wird Ihnen sagen, dann sollten Sie einfach über die Zeilen beider Blätter parallel durchlaufen.

+0

Wenn ich eine Testlinie print (ws._calculate_dimension()) laufen bekomme ich Traceback (jüngste Aufforderung zuletzt): File "/XLCleaner.py", Zeile 319, in print (ref_ws._calculate_dimension()) Datei "/lib/python3.5/site-packages/openpyxl/worksheet/read_only.py", Zeile 214, in _calculate_dimension max_col = max (max_col, Zelle.Spalte) TypeError: nicht korrigierbare Typen: NoneType()> int () Was ist seltsam ist, dass ws.max_row die entsprechende Anzahl von Zeilen aus dem Excel-Blatt - 11.000 zurückgibt. Wenn ich einfach alle Zeilen lösche, um 50 Zeilen zu belassen, läuft das Programm wie angekündigt. – Philong

+0

Sieht aus wie eine möglicherweise beschädigte Datei. Sie können Zeilen aus einer schreibgeschützten Datei nicht löschen, daher weiß ich nicht, was Sie meinen. In jedem Fall werden Sie mit nur 11.000 Zeilen alles in Erinnerung behalten. Oder schreiben Sie Ihren Code neu, um 'ws.iter_rows()' zu verwenden. Ich kann nicht viel von deinem Code verstehen. –

+0

Entschuldigung, ich hätte klarer sein sollen. Ich meinte, um meinen Code zu testen, ging ich manuell in MS Excel und löschte die Zeilen, um es weniger Belastung zu machen. Sobald ich bestätigt habe, dass mein Code funktioniert hat, habe ich ihn auf dem Original-Excel-Blatt von 11.000 Zeilen ausgeführt - wo es steht. @ Charlie Clark. Ich schätze den Versuch – Philong

-1

Anstatt zu versuchen, große Excel in openpyxl zu lesen versuchen Sie pandas erhalten Sie besseres Ergebnis. Pandas hat bessere Funktionen, um die Daten zu reinigen, die Sie tun sollten. Hier

ist ein Beispiel für 10000 Zeilen und 30 Spalten von Daten, die geschrieben und gelesen werden zurück in Pandas:

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.randn(10000,30)) 
df.to_excel('test.xlsx') 
df1 = pd.read_excel('test.xlsx') 
+0

Pandas verwendet intern die 'xlrd'-Bibliothek, um Excel-Dateien zu lesen. Je nachdem, was Sie tun möchten, und in diesem Fall ist der schreibgeschützte Modus von openpyx besser geeignet. –

+0

@CharlieClark während 'openpyxl' Read-Only-Modus ist besser geeignet, OP ist nicht in der Lage, seine/ihre Excel mit 300K + -Zellen zu lesen, die es verwenden, während dies ein Beispiel zeigt, wie Pandas mit dem Lesen von 300K-Zellen funktioniert. – Abbas

+0

Nein, es gibt kein Problem beim Lesen der Datei und die Größe ist hier nicht relevant. Der verwendete Code basiert auf einer optionalen Optimierung, die die Dimensionen des Blattes an den Anfang des XML-Dokuments stellt. Wenn dies fehlt, dann können Sie ipso facto nicht verwenden, aber die Zellen können immer noch gelesen werden. Wie oben erwähnt, kann openpyx problemlos 300k Zellen im Speicher verarbeiten. –