我有大量.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 :(得分: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 ...