2017-06-26 2 views
3

Ich versuche, Daten aus einer .xlsx-Datei in eine MySQL-Datenbank mit Python zu lesen.Schnellste Möglichkeit, .xlsx-Datei mit Python zu lesen

Hier ist mein Code:

wb = openpyxl.load_workbook(filename="file", read_only=True) 
ws = wb['My Worksheet'] 

conn = MySQLdb.connect() 
cursor = conn.cursor() 

cursor.execute("SET autocommit = 0") 

for row in ws.iter_rows(row_offset=1): 
    sql_row = # data i need 
    cursor.execute("INSERT sql_row") 

conn.commit() 

Leider openpyxl der ws.iter_rows() ist sehr langsam. Ich habe ähnliche Methoden mit den Modulen xlrd und pandas ausprobiert. Immer noch langsam. Irgendwelche Gedanken?

+6

Haben Sie 'pd.read_excel ('Dateiname.xlsx', 'Blattname') untersucht. To_sql (..., conn_details, ..)'? – Zero

+0

EDIT: es scheint, Sie können row_offset nicht mit ws.rows, nur mit ws.iter_rows verwenden. und ich bin mir nicht sicher, ob ws.rows schneller ist – citizen2077

+1

Das Blatt als CSV zu speichern und 'read_csv' zu verwenden, verringert die Zeit erheblich. 'read_excel' verwendet Python-Code, während' read_csv' C verwendet. – ayhan

Antwort

0

Sie müssen Ihren Code wirklich benchmarken und Informationen über die Größe des Arbeitsblatts und die Verarbeitungszeit bereitstellen.

Der schreibgeschützte Modus von openpyxl ist im Wesentlichen eine Speicheroptimierung, bei der das gesamte Arbeitsblatt nicht in den Arbeitsspeicher geladen wird. Wenn es um das Analysieren von Excel-Arbeitsblättern geht, ist die meiste Arbeit die Umwandlung von XML in Python, und dem sind Grenzen gesetzt.

jedoch zwei Optimierungen tun in den Sinn:

  • halten Sie Ihre SQL-Anweisung außerhalb der Schleife
  • Verwendung executemany dem Fahrer auf einmal viele Reihen passieren

Diese können kombiniert in etwas wie wie

INSERT_SQL = "INSERT INTO mytable (name, age…) VALUES (%s, %s, …)" 
c.executemany(INSERT_SQL, ws.values) 

Wenn Sie nur möchte eine Teilmenge der Zeilen dann unter Verwendung itertools.islice

Dies sollte schneller sein als Ihr aktueller Code, aber Sie sollten keine Wunder erwarten.

Wenn es um reine Leistung geht, ist xlrd beim Lesen von Arbeitsblättern ein wenig schneller als openpyxl, da es einen kleineren Speicherbedarf hat, der hauptsächlich mit einer schreibgeschützten Bibliothek zusammenhängt. Aber es lädt immer eine ganze Arbeitsmappe in den Speicher, die nicht unbedingt gewünscht wird.

Verwandte Themen