python - 用于 CSV 导入的 SQLite 事务

标签 python csv sqlite raspberry-pi

我对 Python 非常陌生,一直在使用我的树莓派来启动并运行一个脚本,将数百万个传感器数据记录导入到 sqlite 中。我想在事务中执行此操作以使流程更加高效。我正在尝试将事务分解为 10k block ,如下所示:Python CSV to SQLite

到目前为止我已经

import csv, sqlite3, time

def chunks(data, rows=10000):
    for i in range (0, len(data), rows):
            yield data[i:i+rows]

if __name__ == "__main__":

    t = time.time()

con = sqlite3.connect('test.db')
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS sensor;")
cur.execute("CREATE TABLE sensor(key INT, reading REAL);")

filename = 'dummy.csv'
reader = csv.reader(open(filename,"r"))
divdata = chunks(reader)

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

    for col1, col2 in chunk:
            cur.execute('INSERT INTO sensor (key, reading) VALUES (?, ?)', (col1, col2))

    con.execute('COMMIT')

我在 python 3.2.3 中收到以下错误:

Traceback (most recent call last):
File "/home/pi/test1.py", line 20, in <module>
for chunk in divdata:
File "/home/pi/test1.py", line 4, in chunks
for i in range (0, len(data), rows):
TypeError: object of type '_csv.reader' has no len()

我显然在某个地方搞乱了 block 部分,因为没有 block 和事务,一切(基本插入)都可以正常工作。任何帮助表示赞赏。

最佳答案

你的 SQL 看起来没问题。不过,我确实发现您的 CSV 阅读器存在问题:它不支持您在 chunks() 中使用 len() 的方式。

您可以使用更典型的for row in data循环,或者使用one of the techniques described in this thread如果您需要将文件分成 block 。

关于python - 用于 CSV 导入的 SQLite 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062694/

相关文章:

sqlite - Sqlite 与 CSV 文件的操作性能

perl - 为什么 SQLite 在使用 Perl 的 DBD::SQLite 时为事务中的第二个查询提供 "database is locked"?

Python 3 - 从整数转换为 'bytes' 然后连接它们(用于串行传输)

python - 如何执行 Python CGI 脚本?

python - 尝试在 for 循环之外使用变量会出现 SyntaxError : no binding for nonlocal 'max_' found

python - 函数 np.interp 和 pandas Python 出错

将逗号分隔列拆分为多对多关系的 SQL 查询

MySQL 不会将\N CSV 导入为NULL

python - 为什么密度直方图在 y 轴上显示有点奇怪的值?

python - 插入多个值 - sqlite3.InterfaceError : Error binding parameter 0 - probably unsupported type