在Python中逐步浏览CSV文件

时间:2019-05-06 14:38:29

标签: python mysql executemany

我正试图加快将大型CSV文件加载到MySQL数据库的速度。使用此代码,加载4GB文件大约需要4个小时:

with open(source) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)
    insert_sql = """ INSERT INTO billing_info_test (InvoiceId, PayerAccountId, LinkedAccountId) VALUES (%s, %s, %s) """
    for row in csv_reader:
        cursor.execute(insert_sql,row)
        print(cursor.rowcount, 'inserted with LinkedAccountId', row[2], 'at', datetime.now().isoformat())
    print("Committing the DB")
    mydb.commit(
cursor.close()
mydb.close()

我想使用executemany()语句来加快速度。为此,您必须将元组列表传递给第二个参数。

如果我在每行迭代中构建列表,它将变得太大,并且当列表太大时,我将出现内存不足错误,并且脚本将崩溃。

我无法获得在范围声明中使用的csv_reader或csv_file长度。

我如何一次遍历CSV文件1000行,并将结果存储在列表中,在executemany中使用它,然后存储接下来的1000行,依此类推,直到CSV文件结束?

2 个答案:

答案 0 :(得分:1)

如果您需要在mysql中进行高速插入,可以尝试使用:

LOAD DATA LOCAL INFILE '/path/to/my_file.csv' INTO TABLE my_table;

答案 1 :(得分:0)

一个小提示:

In [1]: import itertools

In [2]: rows = iter(range(10))

In [3]: while True:
   ...:     batch = [*itertools.islice(rows, 3)]
   ...:     if not batch:
   ...:         break
   ...:     print(batch)
   ...:
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]

但是我应该同意@heliosk的观点,更好的解决方案是对大型文件使用LOAD DATA INFILE。您可能还需要disable keys,直到导入完成。