【问题标题】:python import csv to sqlitepython将csv导入sqlite
【发布时间】:2015-09-23 11:14:20
【问题描述】:

您好,我正在尝试使用 python tkinter 将 csv 文件导入 sqlite3 数据库。 我使用 askopenfilename 对话框打开文件并将文件传递给 readFile 函数。

def csvFile(self):
        f1 = askopenfilename()
       self.readFile(f1)

def readFile(self, filename):
    conn = sqlite3.connect('Unicommerce.db')
    cur = conn.cursor() 
    cur.execute("""CREATE TABLE IF NOT EXISTS unicom(products varchar,channel varchar,regulatory_forms varchar,shipment varchar)""")
    filename.encode('utf-8')
    print "test1"
    reader = csv.reader(filename)
    for field in reader:
        cur.execute("INSERT INTO unicom VALUES (?,?,?,?);", field)

    conn.commit()
    conn.close()

我收到此错误。

cur.execute("INSERT INTO unicom VALUES (?,?,?,?);", field)
ProgrammingError: Incorrect number of bindings supplied. The current statement uses 4, and there are 1 supplied.

我尝试了所有可用的解决方案,但无法将文件导入数据库。
我还尝试了这些链接中给出的尝试解决方案
Importing a CSV file into a sqlite3 database table using Python
Python CSV to SQLite

编辑:链接到输入文件Input File

【问题讨论】:

  • 此错误意味着field 中没有足够的值来匹配您的表达式。尝试在 SQL 命令之前添加 print repr(field) 以查看 field 实际包含的内容。
  • 如果你能提供一些输入数据的例子会更简单!
  • 它正在打印这个 -- ['C'] 。我包括了我的输入文件。检查编辑
  • askopenfilename 有什么作用?看起来您在需要文件对象时尝试使用带有 csv 文件名的 reader(请参阅docs.python.org/2/library/csv.html#csv.reader)。您需要先打开文件,然后再将其提供给阅读器。试试reader = csv.reader(open(filename, "r"))
  • 感谢我使用了 open(filename) 并且成功了

标签: python sqlite csv


【解决方案1】:

在将文件传递给csv.reader 之前,您需要打开文件。这是一个有效的基本可运行示例。我添加了一个类以允许您现有的方法按原样使用。

import sqlite3
import csv

class csvrd(object):
    def csvFile(self):

        self.readFile('Labels.csv')

    def readFile(self, filename):
        conn = sqlite3.connect('Unicommerce.db')
        cur = conn.cursor() 
        cur.execute("""CREATE TABLE IF NOT EXISTS unicom(products varchar,channel varchar,regulatory_forms varchar,shipment varchar)""")
        filename.encode('utf-8')
        print "test1"
        with open(filename) as f:
            reader = csv.reader(f)
            for field in reader:
                cur.execute("INSERT INTO unicom VALUES (?,?,?,?);", field)

        conn.commit()
        conn.close()

c = csvrd().csvFile()

【讨论】:

    【解决方案2】:

    使用熊猫:

    import pandas
    import sqlite3
    
    conn = sqlite3.connect("test.sqlite")
    
    conn.execute("CREATE TABLE if not exists Data (Column1 TEXT, Column2 TEXT)")
    
    df = pandas.read_csv("test.csv")
    df.to_sql("Data", conn, if_exists='append', index=False)

    【讨论】:

      【解决方案3】:

      execute 可以这样工作:

      1. cur.execute("INSERT INTO unicom VALUES (value1,value2, value3,value4);") 其中value1..4 是您数据的正确文本表示形式。
      2. cur.execute("INSERT INTO unicom VALUES (?, ?, ?, ?);", [value1,value2, value3,value4] where value1..4 in list 和 db driver 负责正确解释主要数据类型。

      好的,因为我无法查看您的数据,所以我想如下:

      for field in reader:
          cur.execute("INSERT INTO unicom VALUES (?,?,?,?);",\
          field.slpit(my_separator)) #create list with 4 elements for second execute argument
      

      【讨论】:

        【解决方案4】:

        我想分享一个我用来很容易地将我的 csv 转换为 sqlite 数据库的库。

        它是csv2sqlite

        在终端中运行:csv2sqlite.py {csv-file-path} {sqlite-db-path} [{table-name}]。

        确保您的数据库具有与 csv 相同的列编号。

        希望对你有帮助。

        谢谢。

        【讨论】:

          猜你喜欢
          • 2013-02-03
          • 2012-09-14
          • 2011-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-28
          • 2011-04-16
          • 2017-03-25
          相关资源
          最近更新 更多