从具有不同列名的csv文件创建sqlite表
问题描述:
我有大量.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
填充以前的行?
答
如果所有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 ...
不幸的是我无法适应RAM中的所有文件。我喜欢你的方法,有没有办法使用chunk方法并在每个'df.to_sql'后转储'df'来释放RAM?我已经尝试了'del df',但是这并没有解放RAM。 –