用Python实现从CSV到SQLite的快速数据移动

用Python实现从CSV到SQLite的快速数据移动,python,sqlite,csv,Python,Sqlite,Csv,我有个问题。有数百个CSV文件,每个文件大约有1000000行。 我需要以一种特定的方式移动数据,但脚本工作速度非常慢(每小时只需要10个Tosand) 我的代码: 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 = lit

我有个问题。有数百个CSV文件,每个文件大约有1000000行。 我需要以一种特定的方式移动数据,但脚本工作速度非常慢(每小时只需要10个Tosand)

我的代码:

    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()
我发现了一条关于隔离级别和对数据库的单一访问的信息,但它并没有很好地工作

行CSV文件有一个结构:1,item1 | 2,item2


有人能帮我吗?谢谢

不要执行sql插入。首先准备CSV文件,然后执行以下操作:

.separator <separator>
.import <loadFile> <tableName>
分隔符
.进口

请参见此处:

不要执行sql插入。首先准备CSV文件,然后执行以下操作:

.separator <separator>
.import <loadFile> <tableName>
分隔符
.进口

请参见此处:

不要执行sql插入。首先准备CSV文件,然后执行以下操作:

.separator <separator>
.import <loadFile> <tableName>
分隔符
.进口

请参见此处:

不要执行sql插入。首先准备CSV文件,然后执行以下操作:

.separator <separator>
.import <loadFile> <tableName>
分隔符
.进口

请参见此处:

您当然不想为要插入的每一行创建一个新的游标对象,而检查每一行的表创建肯定会降低速度-

我建议分两步来做:第一步 在记录的第二次过程中,创建所需的表 数据。如果它仍然很慢,你可以做一个 更复杂的内存中数据收集 插入并执行“executemany”-但这将 在内存中按名称对数据进行分组需要一些复杂度 来之前

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()

您当然不想为要插入的每一行创建一个新的游标对象,而检查每一行的表创建肯定会降低速度-

我建议分两步来做:第一步 在记录的第二次过程中,创建所需的表 数据。如果它仍然很慢,你可以做一个 更复杂的内存中数据收集 插入并执行“executemany”-但这将 在内存中按名称对数据进行分组需要一些复杂度 来之前

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()

您当然不想为要插入的每一行创建一个新的游标对象,而检查每一行的表创建肯定会降低速度-

我建议分两步来做:第一步 在记录的第二次过程中,创建所需的表 数据。如果它仍然很慢,你可以做一个 更复杂的内存中数据收集 插入并执行“executemany”-但这将 在内存中按名称对数据进行分组需要一些复杂度 来之前

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()

您当然不想为要插入的每一行创建一个新的游标对象,而检查每一行的表创建肯定会降低速度-

我建议分两步来做:第一步 在记录的第二次过程中,创建所需的表 数据。如果它仍然很慢,你可以做一个 更复杂的内存中数据收集 插入并执行“executemany”-但这将 在内存中按名称对数据进行分组需要一些复杂度 来之前

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()

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

  • 有没有办法先处理CSV并将其转换为SQL语句
  • CSV中的行是否按表分组(
    项目名称)
    ?如果是,您可以将要插入到同一个表中的行累加(为同一个表生成一组
    INSERT
    语句),并且如果不存在
    CREATE table,则只在生成的语句集前面加一次前缀,而不是每一个
  • 如果可能,请使用批量插入。如果我没弄错的话,SQLite v.3.27.1引入了大容量插入。有关这方面的更多信息:
  • 如果需要,批量插入到块中。有关这方面的更多信息:

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

  • 有没有办法先处理CSV并将其转换为SQL语句
  • CSV中的行是否按表分组(
    项目名称)
    ?如果是,您可以将要插入到同一个表中的行累加(为同一个表生成一组
    INSERT
    语句),并且如果不存在
    CREATE table,则只在生成的语句集前面加一次前缀,而不是每一个
  • 如果可能,请使用批量插入。如果我没弄错的话,SQLite v.3.27.1引入了大容量插入。有关这方面的更多信息:
  • 如果需要,批量插入到块中。有关这方面的更多信息:

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

  • 有没有办法先处理CSV并将其转换为SQL语句
  • CSV中的行是否按表分组(
    项目名称)
    ?如果是,您可以将要插入到同一个表中的行累加(为同一个表生成一组
    INSERT
    语句),并且如果不存在
    CREATE table,则只在生成的语句集前面加一次前缀,而不是每一个
  • 如果可能,请使用批量插入。如果我没弄错的话,SQLite v.3.27.1引入了大容量插入。有关这方面的更多信息:
  • 如果需要,批量插入到块中。有关这方面的更多信息:

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

  • 有没有办法先处理CSV并将其转换为SQL语句
  • CSV中的行是否按表分组(
    项目名称)
    ?如果是,您可以将要插入到同一个表中的行累加(为同一个表生成一组
    INSERT
    语句),并且如果不存在
    CREATE table,则只在生成的语句集前面加一次前缀,而不是每一个
  • 如果可能,请使用批量插入。如果我没弄错的话,SQLite v.3.27.1引入了大容量插入。有关这方面的更多信息:
  • 如果需要,批量插入到块中。有关这方面的更多信息:

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

    我们使用sqlite3数据库作为示例,并使用其他数据库