提取大型Postgres表,然后使用Python Pandas Data Frame将其写入csv文件

时间:2019-03-26 20:11:25

标签: python pandas postgresql csv

我正在读取postgres表,提取数据并将其加载到csv文件中。我的问题是,我最多可以读取5gb TABLE并成功创建一个csv文件。我的一张表是35 GB,无法创建csv文件,该进程被终止。

我怀疑我的数据框无法处理大尺寸文件。

我们该如何解决这个问题并成功创建csv文件?

def table_to_csv(sql, file_path, dbname,port, user):

    """This function creates a csv file from PostgreSQL with query
    """
    try:
        conn = psycopg2.connect(dbname=dbname,  port=port, user=user)
        print("Connecting to Database")
        # Get data into pandas dataframe
        df = pd.read_sql(sql, conn)
        # Write to csv file
        df.to_csv(file_path, encoding='utf-8', header = True,doublequote = True, sep=',', index=False)
        print("CSV File has been created")
        conn.close()

    except Exception as e:
        print("Error: {}".format(str(e)))
        sys.exit(1)

2 个答案:

答案 0 :(得分:0)

由于您的数据库正在本地计算机上运行,​​因此最有效的选择可能是使用PostgreSQL's COPY command,例如像

COPY table_name TO file_path WITH (FORMAT csv, ENCODING UTF8, HEADER);

PostgreSQL会将数据直接保存到文件本身,而无需立即将其全部读取到内存中或让您的Python代码完全读取它。

您应该能够通过psycopg2的标准cursor.execute function来运行它。当然,您也可以通过psql或您选择的其他PostgreSQL客户端来运行它。

答案 1 :(得分:0)

这与Cursor及其复制专家功能一起使用。这是代码段

  cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    #execute
    with open("/sample.csv", 'w') as fd:

        cur.copy_expert("COPY sample TO STDOUT WITH (FORMAT CSV,  HEADER TRUE, 
        FORCE_QUOTE *)", fd)