我有问题。有数百个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
有人能帮助我吗?谢谢!
答案 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语句。尝试优化。
item name
)?如果是,您可以累积要插入到同一个表中的行(为同一个表生成一组INSERT
语句),并且仅将结果语句集合作为CREATE TABLE IF NOT EXISTS
一次,而不是每个它们。答案 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;将导入数据(如果存在),否则创建新数据可以导入数据。