0
with open((path + 'stuff.csv'),'r+') as fin1:
    dr1 = csv.DictReader(fin1)
    create1="CREATE TABLE LGD ("
    exe1="INSERT INTO LGD ("
    for a in dr1.fieldnames:
        if a=='':
            pass
        elif ' ' in a:
            create1+=a.replace(" ","")+','
            exe1+=a.replace(" ","")+','
        else:
            create1 += a + ","
            exe1+= a + ","
    create1 = create1[:-1]
    exe1=exe1[:-1]
    create1 +=");"
        exe1+=") VALUES ("
    for a in range(len(dr1.fieldnames)-1):
        exe1+='?'+","
    exe1=exe1[:-1]
    exe1+=");"
    cur.execute(create1)
    to_db1 = [(a[dr1.fieldnames[0]],a[dr1.fieldnames[1]],a[dr1.fieldnames[2]],a[dr1.fieldnames[3]],a[dr1.fieldnames[4]]) for a in dr1]
    cur.executemany(exe1,to_db1)
    conn.commit()

私の目標は、各 csv ドキュメントをテーブルとして sqlite データベースにインポートすることです。100個持っているとしましょう。

現在、コードは文字列を動的に書き込みますが、列の数を定義する必要がないように to_db1 リストを作成するにはどうすればよいですか?

特にこの行

to_db1 = [(a[dr1.fieldnames[0]],a[dr1.fieldnames[1]],a[dr1.fieldnames[2]],a[dr1.fieldnames[3]],a[dr1.fieldnames[4]]) for a in dr1]

この質問を見たことがありますが、フィールド名にスペースが含まれており、多くのドキュメントが編集できないため、それらを取り出すことができないため、私のものは異なります。また、以下に示すリストの書式設定を失いたくありません。

[(stuff,stuff,stuff),(stuff,stuff,stuff)]

sqlite3およびpythonで、csvからデータベーステーブルに列を動的にインポートします

私の質問を言い換えると、コンパイル時に列名を定義せずに to_db1 リストを作成したいと思います。この形式で作成する必要があります

[(stuff,stuff,stuff),(stuff,stuff,stuff)] 

実行時に。

4

1 に答える 1

1

スペースを含まず、カンマで結合されたフィールド名を取得するには、リスト内包表記を使用できます。

names = ['my _id', 'some a', 'some b']
sanitized_names = "({})".format(", ".join(x.replace(' ','') for x in names))

# => (my_id, somea, someb)

そこから、リンク先の回答を再利用できます。

dr1のような順序で辞書からタプルを取得するにはdr1.fieldnames、 を使用します[tuple(a[x] for x in dr1.fieldnames) for a in dr1]

于 2013-06-07T16:22:36.663 に答える