1

我有大量.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

4

1 回答 1

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

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

ALTER TABLE tab_name ADD COLUMN ...
于 2017-10-18T18:20:16.970 回答