【问题标题】:Creating sqlite table from csv files with different column names从具有不同列名的 csv 文件创建 sqlite 表
【发布时间】:2017-10-18 18:10:47
【问题描述】:

我有大量 .csv 文件,我想将它们放入 sqlite 数据库。大多数文件包含相同的列名,但有些文件有额外的列。

我尝试过的代码是(改为通用的):

import os    
import pandas as pd
import sqlite3

conn = sqlite3.connect('test.db')
cur = conn.cursor()

os.chdir(dir)
for file in os.listdir(dir): 
    df = pd.read_csv(file)
    df.to_sql('X', conn, if_exists = 'append')

当遇到包含不在表 X 中的列的文件时,我收到错误:

OperationalError: table X has no column named ColumnZ

如何更改我的代码以将新列附加到表中并用NaN 填充先前的行?

【问题讨论】:

    标签: python-3.x sqlite pandas operationalerror


    【解决方案1】:

    如果所有 DataFrame 都可以放入 RAM,您可以这样做:

    import glob
    
    files = glob.glob(r'/path/to/csv_files/*.csv')
    
    df = pd.concat([pd.read_csv(f) for f in files], ignore_index=True)
    df.to_sql('X', conn, if_exists = 'replace')
    

    演示:

    In [22]: d1
    Out[22]:
       a  b
    0  0  1
    1  2  3
    
    In [23]: d2
    Out[23]:
       a  b  c
    0  1  2  3
    1  4  5  6
    
    In [24]: d3
    Out[24]:
        x   b
    0  11  12
    1  13  14
    
    In [25]: pd.concat([d1,d2,d3], ignore_index=True)
    Out[25]:
         a   b    c     x
    0  0.0   1  NaN   NaN
    1  2.0   3  NaN   NaN
    2  1.0   2  3.0   NaN
    3  4.0   5  6.0   NaN
    4  NaN  12  NaN  11.0
    5  NaN  14  NaN  13.0
    

    或者,您可以将所有列存储为一个列表,并使用SQLite ALTER TABLE statement 在循环中检查新 DF 是否有其他列并将这些列添加到 SQLite DB:

    ALTER TABLE tab_name ADD COLUMN ...
    

    【讨论】:

    • 不幸的是,我无法将所有文件都放入 RAM。不过我喜欢你的方法,有没有办法使用块方法并在每个df.to_sql 之后转储df 以释放RAM?我试过del df 但这并没有释放内存。
    猜你喜欢
    • 2018-09-15
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多