2016-09-14 40 views
4

大きなcsvファイルからsqlite3データベースにデータを移行したいと考えています。pandas.DataFrame.to_sqlの進行状況バー

のPython 3.5に私のコード使用してパンダ:

con = sqlite3.connect(DB_FILENAME) 
df = pd.read_csv(MLS_FULLPATH) 
df.to_sql(con=con, name="MLS", if_exists="replace", index=False) 

それはto_sqlメソッドの実行の現在のステータス(プログレスバー)を印刷することは可能ですか?

私はtqdmについて記事を見ましたが、これを行う方法が見つかりませんでした。

答えて

6

残念ながらDataFrame.to_sqlは、チャンクごとのコールバックを提供しません。これは、tqdmがステータスを更新するために必要です。ただし、チャンクでのデータフレームのチャンクを処理することができます:私は依存せずに、完全な実行可能な例を持っていることのために、ここでデータフレームをインラインで生成しています

import sqlite3 
import pandas as pd 
from tqdm import tqdm 

DB_FILENAME='/tmp/test.sqlite' 

def chunker(seq, size): 
    # from http://stackoverflow.com/a/434328 
    return (seq[pos:pos + size] for pos in xrange(0, len(seq), size)) 

def insert_with_progress(df, dbfile): 
    con = sqlite3.connect(dbfile) 
    chunksize = int(len(df)/10) # 10% 
    with tqdm(total=len(df)) as pbar: 
     for i, cdf in enumerate(chunker(df, chunksize)): 
      replace = "replace" if i == 0 else "append" 
      cdf.to_sql(con=con, name="MLS", if_exists=replace, index=False) 
      pbar.update(chunksize) 

df = pd.DataFrame({'a': range(0,100000)}) 
insert_with_progress(df, DB_FILENAME) 

注意。

結果は非常に素晴らしいです:

enter image description here

+1

= pd.read_csv(csv_filename、...)が非常に遅く働くDFので、私のcsvファイルは、ディスク上の1.7ギガバイトの行われます。しかし、私はここで解決策を見つけました:http://stackoverflow.com/a/28371706/5856795、あなたの答えと答え@ sebastian-raschkaは私にこの作業を手助けします。 – Andrei

関連する問題