2017-10-18 16 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

すべてのデータフレームが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に収めることができません。私はあなたの方法が好きですが、チャンクメソッドを使って 'df'をダンプして各df.to_sqlの後にRAMを解放する方法はありますか?私は 'del df'を試しましたが、それはRAMを解放していません。 –

関連する問題