首页 > 解决方案 > 是否有一个 Pyhon 模块可以从 Oracle 读取并拆分为多个基于列的内存使用量较少的 excel 文件?

问题描述

我正在尝试根据列(医院名称)中的值拆分 oracle 表。数据集是 66 列中的约 3 百万行。我正在尝试将 1 家医院的数据从 3 个不同的表格写入 3 个不同工作表中的 1 个 Excel 工作簿。

我有一个运行代码可用于约 700K 行,但新集合太大,我遇到了内存问题。我尝试修改我的代码以每次使用 for 循环访问数据库以获取医院名称。但是我得到明确关闭它的 xlsx 错误。

import cx_Oracle
import getpass
import xlsxwriter
import pandas as pd

path = "C:\HN\1"

p = getpass.getpass()

# Connecting to Oracle
myusername = 'CN138609'

dsn_tns = cx_Oracle.makedsn('oflc1exa03p-vip.centene.com', '1521', service_name='IGX_APP_P')

conn = cx_Oracle.connect(user=myusername, password=p, dsn=dsn_tns)

sql_4 = "select distinct hospital_name from HN_Hosp_Records"


df4 = pd.read_sql(sql_4,conn)



hospital_name = list(df4['HOSPITAL_NAME'])

for x in hospital_name:
    hosp_name = {"hosp" : x}
    sql_1 = "select * from HN_Hosp_Records where hospital_name = :hosp"
    sql_2 = "select * from HN_CAP_Claims_Not_In_DHCS where hospital_name = :hosp"
    sql_3 = "select * from HN_Denied_Claims where hospital_name = :hosp"

    df1 = pd.read_sql(sql_1,conn,params=hosp_name)
    df2 = pd.read_sql(sql_2,conn,params=hosp_name)
    df3 = pd.read_sql(sql_3,conn,params=hosp_name)

    df_dhcs = df1.loc[df1['HOSPITAL_NAME'] == x]
    df_dw = df2.loc[df2['HOSPITAL_NAME'] == x]
    df_denied = df3.loc[df3['HOSPITAL_NAME'] == x]
    # Create a new excel workbook
    writer = pd.ExcelWriter(path + x + "_HNT_P2_REC_05062019.xlsx", engine='xlsxwriter')
    # Write each dataframe to a different worksheet.
    df_dhcs.to_excel(writer, sheet_name="DHCS")
    df_dw.to_excel(writer, sheet_name = "Not In DHCS")
    df_denied.to_excel(writer, sheet_name = "Denied")
    writer.close()

这是我收到的警告/错误。代码不会停止,但没有文件正在输出:

文件“C:\ProgramData\Anaconda3\lib\site-packages\xlsxwriter\workbook.py”,第 153 行,在del raise Exception(“工作簿析构函数中捕获的异常。”异常:工作簿析构函数中捕获的异常。显式关闭()工作簿可能需要。

标签: python-3.xoracle11gxlsxwriter

解决方案


我解决了。而不是使用 %s 绑定变量是诀窍。


推荐阅读