【问题标题】:csv into sqlite table pythoncsv到sqlite表python
【发布时间】:2017-06-13 12:37:12
【问题描述】:

使用 python,我正在尝试将 csv 导入到 sqlite 表中,并使用 csv 文件中的标题成为 sqlite 表中的标题。代码运行,但似乎没有创建表“MyTable”。代码如下:

with open ('dict_output.csv', 'r') as f:
    reader = csv.reader(f)
    columns = next(reader)

#Strips white space in header
    columns = [h.strip() for h in columns]


#reader = csv.DictReader(f, fieldnames=columns)
    for row in reader:
        print(row)

    con = sqlite3.connect("city_spec.db")
    cursor = con.cursor()

#Inserts data from csv into table in sql database.
    query = 'insert into MyTable({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    print(query)
    cursor = con.cursor()
    for row in reader:
        cursor.execute(query, row)
#cursor.commit()

    con.commit()

    con.close()

提前感谢您的帮助。

【问题讨论】:

  • 你的“创建表”语句在哪里?

标签: python sqlite csv


【解决方案1】:

您可以使用 Pandas 来简化此操作(您可能需要先pip install pandas):

import sqlite3
import pandas as pd

# load data
df = pd.read_csv('dict_output.csv')

# strip whitespace from headers
df.columns = df.columns.str.strip()

con = sqlite3.connect("city_spec.db")

# drop data into database
df.to_sql("MyTable", con)

con.close()

Pandas 会为您完成所有繁重的工作,包括创建实际的表格!

【讨论】:

  • 脚本将(可能)在倒数第二行使用 'name=' 发出嘶嘶声。只需将其删除,因为 name 无论如何都是位置参数。
  • 您对 strip 的需求有信心吗?我尝试省略它,并且 sql 变量名似乎没问题。但我不是熊猫专家。
  • 不,但它在发布的原始代码中,我想尽可能地匹配功能。
  • 不会有伤害的。 :)
【解决方案2】:

您尚未将答案标记为已解决,因此请继续。

只连接一次数据库,只创建一次游标。 您只能读取一次 csv 记录。 我添加了仅基于列名创建数据库表的粗略形式的代码。同样,这仅在循环中完成一次。 您的插入代码工作正常。

import sqlite3
import csv

con = sqlite3.connect("city_spec.sqlite") ## these statements belong outside the loop
cursor = con.cursor()  ## execute them just once

first = True
with open ('dict_output.csv', 'r') as f:
    reader = csv.reader(f)
    columns = next(reader)
    columns = [h.strip() for h in columns]
    if first:
        sql = 'CREATE TABLE IF NOT EXISTS MyTable (%s)' % ', '.join(['%s text'%column for column in columns])
        print (sql)
        cursor.execute(sql)
        first = False
    #~ for row in reader:    ## we will read the rows later in the loop
        #~ print(row)

    query = 'insert into MyTable({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    print(query)
    cursor = con.cursor()
    for row in reader:
        cursor.execute(query, row)
    con.commit()
    con.close()

【讨论】:

    【解决方案3】:

    您也可以使用 peewee orm 轻松完成。为此,您只能使用来自 peewee 的扩展,即 playhouse.csv_loader:

    from playhouse.csv_loader import *
    
    db = SqliteDatabase('city_spec.db')
    
    Test = load_csv(db, 'dict_output.csv')
    

    您创建了数据库 city_spec.db,标题为字段,数据来自 dict_output.csv

    如果你没有 peewee 你可以用

    安装它
    pip install peewee
    

    【讨论】:

    • csv_utils 扩展从 peewee 3.0 版开始不再包含在剧场中
    猜你喜欢
    • 2011-08-21
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2012-03-08
    • 2012-09-14
    • 2014-05-15
    • 2017-05-14
    相关资源
    最近更新 更多