如何使用python写出内存csv?

时间:2019-03-28 21:49:07

标签: python sqlite csv

我需要将sql查询的结果输出到csv。查询结果将不在我的内存资源范围内。同样,在熊猫中,csv操作通常比在我中使用csv库要慢得多,因此我不希望使用pandas。

我试图创建以下代码,以批处理1000行的列表,然后将它们附加到csv文件的内容中。当我运行它时,我的系统只会耗尽内存,并且无法正常运行。

我不确定自己在做什么错或者是否有我不了解的事情。

ROWS_AT_ONCE = 1000

curr.execute(
'''
SELECT
*
FROM '''+Table_Name+'''

;
'''
)
rows = curr.fetchall()
headers = list(map(lambda x: x[0], curr.description))
headers = tuple(headers)
csv_w_pointer = open(Export_Path_Name, 'a' , newline='')
csv_writer = csv.writer(csv_w_pointer, delimiter='\t', quotechar='"')
csv_writer.writerow(headers)
batch = list()
for row in rows:
    batch.append(row)
    if len(batch) >= ROWS_AT_ONCE:
        csv_writer.writerow(batch)
    batch = list()
if batch:
    csv_writer.writerow(batch)
del batch

当内存不足时,我需要将sql结果写入csv。我当前的尝试由于内存过多而失败。

2 个答案:

答案 0 :(得分:4)

如果数据集很大,则应避免使用fetchall方法。改为使用fetchmany方法一次仅获取一定数量的行,并将获取的行立即写入CSV以最大程度地减少内存使用量:

ROWS_AT_ONCE = 1000

curr.execute(
'''
SELECT
*
FROM '''+Table_Name+'''

;
'''
)
headers = list(map(lambda x: x[0], curr.description))
headers = tuple(headers)
with open(Export_Path_Name, 'a' , newline='') as csv_w_pointer:
    csv_writer = csv.writer(csv_w_pointer, delimiter='\t', quotechar='"')
    csv_writer.writerow(headers)
    while True:
        rows = curr.fetchmany(ROWS_AT_ONCE)
        if not rows:
            break
        csv_writer.writerows(rows)

答案 1 :(得分:0)

您可以使用odo库来代替所有的csv循环

writing csv to sql

sqlite example

one example用于编写33GB的CSV文件


另一个选择是csv2sqlite.py脚本