Python CSV 到 SQLite

标签 python csv sqlite

我正在“转换”一个大型 (~1.6GB) CSV 文件并将 CSV 的特定字段插入 SQLite 数据库。基本上我的代码看起来像:

import csv, sqlite3

conn = sqlite3.connect( "path/to/file.db" )
conn.text_factory = str  #bugger 8-bit bytestrings
cur = conn.cur()
cur.execute('CREATE TABLE IF NOT EXISTS mytable (field2 VARCHAR, field4 VARCHAR)')

reader = csv.reader(open(filecsv.txt, "rb"))
for field1, field2, field3, field4, field5 in reader:
  cur.execute('INSERT OR IGNORE INTO mytable (field2, field4) VALUES (?,?)', (field2, field4))

除此之外,一切都按我的预期工作......它需要大量的时间来处理。我编码不正确吗?有没有更好的方法来实现更高的性能并完成我所需要的(只需将 CSV 的几个字段转换为 SQLite 表)?

**EDIT -- 我尝试按照建议将 csv 直接导入 sqlite,但结果发现我的文件在字段中有逗号(例如 "My title, comma")。这会导致导入错误。看来这些事件太多了,无法手动编辑文件...

还有其他想法吗??**

最佳答案

Chris 是对的——使用交易;将数据分成 block 然后存储。

"...除非已经在事务中,否则每个 SQL 语句都会为其启动一个新事务。这非常昂贵,因为它需要为每个语句重新打开、写入和关闭日志文件。这可以通过使用 BEGIN TRANSACTION; 和 END TRANSACTION; 语句包装 SQL 语句序列来避免。这种加速也适用于不改变数据库的语句。"- 来源:http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

"...还有另一个技巧可以用来加速 SQLite:事务。每当您必须执行多个数据库写入时,将它们放在一个事务中。而不是每个都写入(并锁定)文件并且每次发出写入查询时,写入只会在事务完成时发生一次。"- 来源:How Scalable is SQLite?

import csv, sqlite3, time

def chunks(data, rows=10000):
    """ Divides the data into 10000 rows each """

    for i in xrange(0, len(data), rows):
        yield data[i:i+rows]


if __name__ == "__main__":

    t = time.time()

    conn = sqlite3.connect( "path/to/file.db" )
    conn.text_factory = str  #bugger 8-bit bytestrings
    cur = conn.cur()
    cur.execute('CREATE TABLE IF NOT EXISTS mytable (field2 VARCHAR, field4 VARCHAR)')

    csvData = csv.reader(open(filecsv.txt, "rb"))

    divData = chunks(csvData) # divide into 10000 rows each

    for chunk in divData:
        cur.execute('BEGIN TRANSACTION')

        for field1, field2, field3, field4, field5 in chunk:
            cur.execute('INSERT OR IGNORE INTO mytable (field2, field4) VALUES (?,?)', (field2, field4))

        cur.execute('COMMIT')

    print "\n Time Taken: %.3f sec" % (time.time()-t) 

关于Python CSV 到 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942402/

相关文章:

javascript - 如何在 Python 中使用 Selenium 定位 onmouseover 元素?

python - 重写 save 方法以在 Django 中创建第二个自动递增字段

api - 将Stripe API中的数据写入golang的CSV文件中

android - 检查一个值是否已经存在于 SQLite 数据库中

python - 使用 Opencv SIFT 时 matches1to2 出错

python - 如何在 SQLAlchemy ORM 中创建跨不同模式的关系?

java - 尝试使用 Java 和 MetaModel API 查询 .CSV 文件

sql-server - 将 CSV 导入 SQl Server 2005 的最简单方法

android - 对sqlite的insert语句返回的row_id的说明

java - SQLite 数据库损坏异常 : database disk image is malformed