【问题标题】:import data from text/csv file into sqlite table using python使用python将文本/csv文件中的数据导入sqlite表
【发布时间】:2020-09-15 08:41:13
【问题描述】:

我正在开发一个连接到现有 SQLite 数据库和表的 python 应用程序。我有一个 CSV 文件,每行包含一个值(股票符号),我想使用 python 将所有值导入现有的表列“符号”。 我该怎么做?

我尝试的是定义一个插入函数:

def insert(symbol):
    conn=sqlite3.connect("stocks.db")
    cur=conn.cursor()
    cur.executemany("INSERT INTO stocks (symbol) VALUES (?)", (symbol,))
    conn.commit()
    conn.close()

然后尝试循环输入值并从那里添加值:

with open("./stocks/sp500_tickers.csv") as data:
      tickers = data.read()
      for ticker in tickers:
          insert(ticker)

但是当我运行 python 代码时,我得到了这个错误:

Traceback (most recent call last):
  File "fetch.py", line 64, in <module>
    insert(ticker)
  File "fetch.py", line 23, in insert
    cur.execute("INSERT INTO stocks (symbol) VALUES (?)", (symbol,))
sqlite3.IntegrityError: UNIQUE constraint failed: stocks.symbol

如果我这样尝试,也会发生同样的事情:

with open("./stocks/sp500_tickers.csv") as data:
      tickers = data.read()
      rows = tickers.split('\n')
      formatted = [tuple(x.split()) for x in rows]
      for ticker in tickers:
          insert(ticker)

表的架构是:

        id INTEGER NOT NULL, 
        symbol VARCHAR, 
        name VARCHAR, 
        price NUMERIC(10, 2), 
        book_value NUMERIC(10, 2), 
        trailing_pe NUMERIC(10, 2), 
        forward_pe NUMERIC(10, 2), 
        trailing_eps NUMERIC(10, 2), 
        forward_eps NUMERIC(10, 2), 
        dividend_yield NUMERIC(10, 2), 
        ma50 NUMERIC(10, 2), 
        ma200 NUMERIC(10, 2), 
        sector VARCHAR, 
        growth_rate NUMERIC(10, 2), 
        PRIMARY KEY (id)
);
CREATE INDEX ix_stocks_id ON stocks (id);
CREATE UNIQUE INDEX ix_stocks_symbol ON stocks (symbol);

我的“sp500_tickers.csv”看起来像这样:

MMM
ABT
ABBV
ABMD
etc

非常欢迎任何帮助!

【问题讨论】:

  • 如果insert 失败,请使用update。为此,您必须执行单个事务,而不是批量 ttransaction。
  • 另外,永远不要低估 print() 命令调试类似这样的东西的能力,例如 print("inserting", symbol) 。知道您要求代码做什么是值得的。

标签: python sqlite csv


【解决方案1】:

来自错误信息

sqlite3.IntegrityError: UNIQUE constraint failed: stocks.symbol

您尝试插入符号列的值似乎不是唯一的。 为该列定义了一个唯一索引。

CREATE UNIQUE INDEX ix_stocks_symbol ON stocks (symbol);

您应该确保插入的值是唯一的,或者删除唯一索引。

【讨论】:

  • 感谢您的评论,但是我认为还有其他问题,我已确保表中没有任何内容,并且仅尝试使用 csv 文件中的 2 个值和相同发生错误。
【解决方案2】:

这个tickers = data.read() 使tickers 成为一个大字符串。这个for ticker in tickers: 遍历字符串中的每个字符。第二次尝试可以解决这个问题,如果不是这里的错字for ticker in tickers:

一旦输入转换为列表,实际上就没有理由对其进行迭代;这有点违背executemany 的目的:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2016-01-21
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多