2017-10-18 94 views
1

我有大量.csv文件,我想放在sqlite数据库中。大多数文件包含相同的列名称,但有一些文件具有额外的列。从具有不同列名的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填充以前的行?

回答

0

如果所有DataFrames可以放入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 

或者您可以将所有的列存储为列表和循环检查是否有新的DF有额外的列并将这些列添加到SQLite DB,使用SQLite ALTER TABLE statement

ALTER TABLE tab_name ADD COLUMN ... 
+0

不幸的是我无法适应RAM中的所有文件。我喜欢你的方法,有没有办法使用chunk方法并在每个'df.to_sql'后转储'df'来释放RAM?我已经尝试了'del df',但是这并没有解放RAM。 –

相关问题