通过Python将快速数据从CSV移动到SQLite

时间:2015-03-09 18:39:32

标签: python sqlite csv

我有问题。有数百个CSV文件,约。每个1,000,000行。 我需要以特定的方式移动数据,但脚本工作非常慢(每小时传递几十万个)。

我的代码:

    import sqlite3 as lite
    import csv
    import os



my_file = open('file.csv', 'r')
reader = csv.reader(my_file, delimiter=',')


date = '2014-09-29'

con = lite.connect('test.db', isolation_level = 'exclusive')
for row in reader:

    position = row[0]
    item_name = row[1]



    cur = con.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS [%s] (Date TEXT, Position INT)" % item_name)
    cur.execute("INSERT INTO [%s] VALUES(?, ?)" % item_name, (date, position))
con.commit()

我找到了一条关于isolation_level和单一访问数据库的信息,但它没有用。

行CSV文件的结构为:1,item1 | 2,ITEM2

有人能帮助我吗?谢谢!

4 个答案:

答案 0 :(得分:3)

不要进行sql插入。首先准备CSV文件,然后执行:

.separator <separator>
.import <loadFile> <tableName>

见这里:http://cs.stanford.edu/people/widom/cs145/sqlite/SQLiteLoad.html

答案 1 :(得分:0)

你当然不想为要插入的每一行创建一个新的游标对象 - 并且检查每行的表创建肯定会减慢你的速度 -

我建议在2次通过中执行此操作:首先 你创建所需的表,在你记录的第二遍 数据。如果它仍然很慢,你可以做一个 更复杂的内存数据收集 插入并执行&#34; executemany&#34; - 但这会 需要一些复杂性来按内存中的名称对数据进行分组 在作出之前;。

import sqlite3 as lite
import csv
import os

my_file = open('file.csv', 'r')
reader = csv.reader(my_file, delimiter=',')

date = '2014-09-29'

con = lite.connect('test.db', isolation_level = 'exclusive')
cur  = con.cursor()

table_names = set(row[1] for row in reader)
my_file.seek(0)

for name in table_names:
     cur.execute("CREATE TABLE IF NOT EXISTS [%s] (Date TEXT, Position INT)" % item_name)

for row in reader:

    position = row[0]
    item_name = row[1]

    cur.execute("INSERT INTO [%s] VALUES(?, ?)" % item_name, (date, position))

con.commit()

答案 2 :(得分:0)

代码效率低下,因为它为CSV中的每一行执行两个SQL语句。尝试优化。

  1. 有没有办法先处理CSV并将其转换为SQL语句?
  2. CSV中的行是否按表格分组(item name)?如果是,您可以累积要插入到同一个表中的行(为同一个表生成一组INSERT语句),并且仅将结果语句集合作为CREATE TABLE IF NOT EXISTS一次,而不是每个它们。
  3. 如果可能,请使用批量插入。如果我做对了,那么随SQLite v.3.27.1引入批量插入。更多相关信息:Is it possible to insert multiple rows at a time in an SQLite database?
  4. 如果需要,可以批量插入块。更多相关信息:Bulk insert huge data into SQLite using Python

答案 3 :(得分:0)

我有同样的问题。现在它解决了!我想与面临同样问题的每个人分享这些方法!

我们使用sqlite3数据库作为示例,其他数据库也可以工作但不确定。我们在python中采用pandas和sqlites模块。

这可以快速将csv文件列表[file1,file2,...]转换为talbes [table1,table2,...]。

import pandas as pd
import sqlite3 as sql


DataBasePath="C:\\Users\\...\\database.sqlite"
conn=sql.connect(DataBasePath)

filePath="C:\\Users\\...\\filefolder\\"    
datafiles=["file1","file2","file3",...]

for f in datafiles:
    df=pd.read_csv(filePath+f+".csv")        
    df.to_sql(name=f,con=conn,if_exists='append', index=False)    
conn.close()

此外,如果数据库不存在,此代码可以创建数据库。 pd.to_sql()&#39; if_exists&#39;的参数。很重要它的价值是&#34;失败&#34;默认情况下,如果存在则导入数据,否则不执行任何操作; &#34;替换&#34;如果存在,则首先删除表,然后创建新表并导入数据; &#34;附加&#34;将导入数据(如果存在),否则创建新数据可以导入数据。