2017-06-26 79 views
3

私はPythonを使って.xlsxファイルからMySQLデータベースにデータを読み込もうとしています。ここでPythonで.xlsxファイルを読む最速の方法

は私のコードです:残念ながら

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

、openpyxlのws.iter_rows()痛々しいほど遅いです。私はxlrdとpandasモジュールを使って同様の方法を試みました。まだ遅いです。何かご意見は?

+6

あなたは 'pd.read_excel( 'filename.xlsx'、 'sheetname')。to_sql(...、conn_details、..)'を調べましたか? – Zero

+0

編集:ws.iter_rowsの場合のみ、ws.rowsでrow_offsetを使用することはできないようです。 ws.rowsの方が速いかどうか分かりません。 – citizen2077

+1

シートをCSV形式で保存し、 'read_csv'を使用すると時間が大幅に短縮されます。 'read_excel'はPythonコードを使用し、' read_csv'はCを使用します。 – ayhan

答えて

0

実際にコードをベンチマークし、ワークシートのサイズと処理に要した時間に関する情報を提供する必要があります。

openpyxlの読み取り専用モードは、本質的に、ワークシート全体をメモリに読み込まないようにするメモリの最適化です。 Excelワークシートを解析する場合、XMLをPythonに変換する作業がほとんどですが、これには限界があります。

しかし、2つの最適化は、心に春を行います

  • をこれらが可能なドライバ

に一度行の多くを渡すためにループ

  • 使用executemany外のSQL文を保ちます

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

    あなただけの場合行のサブセットを使用してから参照してください。itertools.islice

    これは現在のコードよりも速いはずですが、奇跡は期待できません。

    純粋なパフォーマンスになると、xlrdはワークシートを読み込むときにopenpyxlよりも少し速くなります。なぜなら、読み込み専用ライブラリであることが主に関係しているためです。しかし、それは常にメモリに全体のブックを読み込みます。

  • 関連する問題