14

我想将数据从大型 csv 文件迁移到 sqlite3 数据库。

我在 Python 3.5 上使用 pandas 的代码:

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的文章,但没有找到如何执行此操作。

4

3 回答 3

28

不幸的是,没有提供tqdmDataFrame.to_sql需要的逐块回调来更新其状态。但是,您可以逐块处理数据帧:

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

请注意,我在这里生成内联 DataFrame 是为了获得一个没有依赖关系的完整可行示例。

结果非常惊人:

在此处输入图像描述

于 2016-09-14T16:15:34.343 回答
7

我想分享 miraculixx 发布的解决方案的一个变体——我必须为 SQLAlchemy 进行更改:

#these need to be customized - myDataFrame, myDBEngine, myDBTable

df=myDataFrame

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

def insert_with_progress(df):
    con = myDBEngine.connect()
    chunksize = int(len(df) / 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(name="myDBTable", con=conn, if_exists="append", index=False) 
            pbar.update(chunksize)
            tqdm._instances.clear()

insert_with_progress(df)
于 2019-11-04T18:03:40.763 回答
0

用户 miraculixx 上面有一个很好的例子,谢谢。但是,如果您想将它与各种大小的文件一起使用,您应该添加如下内容:

chunksize = int(len(df) / 10)
if chunksize == 0:
    df.to_sql(con=con, name="MLS", if_exists="replace", index=False)
else:
    with tqdm(total=len(df)) as pbar:
    ...
于 2020-04-08T16:54:46.063 回答