如何使用Python编写大型csv文件?

时间:2016-08-10 15:07:30

标签: python csv

我需要从数据库中提取大量数据(> 1GB)到csv文件。我正在使用这个脚本:

localhost:32557/

当写入系统内存不足的文件时出现问题。在这种情况下,还有其他更有效的方法来创建一个大的csv文件吗?

2 个答案:

答案 0 :(得分:2)

psycopg2(OP使用)有fetchmany方法接受size参数。用它来从数据库中读取一定数量的行。您可以使用n的值过期,以在运行时和内存使用之间取得平衡。

fetchmany文档:http://initd.org/psycopg/docs/cursor.html#cursor.fetchmany

    rs_cursor = rs_db.cursor()
    rs_cursor.execute("""SELECT %(sql_fields)s
                         FROM table1""" % {"sql_fields": sql_fields})
    c = csv.writer(open(filename, "wb"))
    c.writerow(headers)

    n = 100
    sqlData = rs_cursor.fetchmany(n)

    while sqlData:
        for row in sqlData:
            c.writerow(row)
        sqlData = rs_cursor.fetchmany(n)

   rs_cursor.close()


您也可以使用生成器将其包装起来以简化代码:

def get_n_rows_from_table(n):
    rs_cursor = rs_db.cursor()
    rs_cursor.execute("""SELECT %(sql_fields)s
                             FROM table1""" % {"sql_fields": sql_fields})
    sqlData = rs_cursor.fetchmany(n)

    while sqlData:
        yield sqlData
        sqlData = rs_cursor.fetchmany(n)
    rs_cursor.close()

c = csv.writer(open(filename, "wb"))
c.writerow(headers)

for row in get_n_rows_from_table(100):
    c.writerow(row)

答案 1 :(得分:0)

你试过fetchone()?

rs_cursor = rs_db.cursor()
rs_cursor.execute("""SELECT %(sql_fields)s
                     FROM table1""" % {"sql_fields": sql_fields})

c = csv.writer(open(filename, "wb"))
c.writerow(headers)
row = rs_cursor.fetchone()
while row:
    c.writerow(row)
    row = rs_cursor.fetchone()

rs_cursor.close()