从具有不同列名的csv文件创建sqlite表

时间:2017-10-18 18:10:48

标签: python-3.x sqlite pandas operationalerror

我有大量.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填充上一行?

1 个答案:

答案 0 :(得分:0)

如果所有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 ...