Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将csv加载到Oracle中_Python_Oracle_Csv - Fatal编程技术网

使用Python将csv加载到Oracle中

使用Python将csv加载到Oracle中,python,oracle,csv,Python,Oracle,Csv,我正在尝试将一个1 GB大小的csv文件(大约100万行)加载到Oracle表中,代码工作正常,如下所示: import cx_Oracle import csv connection1=cx_Oracle.connect("username", "password","ORADB") cur1 = connection1.cursor() with open("Test.csv", "r") as csv_file: csv_reader = csv.reader(csv_file, de

我正在尝试将一个1 GB大小的csv文件(大约100万行)加载到Oracle表中,代码工作正常,如下所示:

import cx_Oracle 
import csv

connection1=cx_Oracle.connect("username", "password","ORADB")
cur1 = connection1.cursor()
with open("Test.csv", "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
next(csv_reader)
i=0
sql1="""insert into TEST_CSV_FILE ( START_TS, END_TS,FLDR, TSK, INST, SRC_ERR,tgt_ERR) 
        values (:1, :2, :3, :4, :5, :6, :7)"""
list=[]
for lines1 in csv_reader:
    print(lines1)
    print(type(lines1))
    cur1.execute(sql1,lines1)
    i=i+1
    print(i)
cur1.close()
connection1.commit()
connection1.close()
但是,性能非常糟糕,即使在2小时后也无法完成加载,是否有一种快速加载此文件的有效方法?我查阅了文档,并尝试使用ExecuteMy而不是execute,但当我尝试使用ExecuteMy时,我得到了以下信息:

    cur1.executemany(sql1,lines1)
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number
任何帮助都将不胜感激

在Christopher和abhlb的帮助下,我更新了下面的代码,以批处理并使用ExecuteMy,但是由于批处理大小为3000,作业耗时2小时,性能仍然很差,我可以进行任何增强以提高性能吗

import cx_Oracle
import csv
from datetime import datetime
start=datetime.now()
connection1=cx_Oracle.connect("username", "password","oradb")
cur1 = connection1.cursor()
with open("test_file.csv", "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
i=0
batch_size=3000
sql1="""insert into TEST_CSV_FILE ( START_TS, END_TS,FLDR, TSK, INST, 
SRC_ERR,tgt_ERR) 
    values (:1, :2, :3, :4, :5, :6, :7)"""
data = []
for line in csv_reader:
    data.append((line[0],line[1],line[2],line[3],line[4],line[5],line[6]))
    if len(data) % batch_size == 0:
        cur1.executemany(sql1, data)
        data = []
if data:
    cur1.executemany(sql1, data)
connection1.commit()
cur1.close()
connection1.close()
print(datetime.now()-start)

您需要将每一行转换为一个值元组

dataToInsert=[csv_读取器中x的元组] cur1.executemanysql1,dataToInsert cur1.close 连接1.commit 连接1.close
@okkadu您可能需要批量处理记录并多次调用executemany。请参阅在cx_Oracle@ChristopherJones中加载CSV文件的示例谢谢您的文档Christopher,我必须对它们进行批处理。@abhlib谢谢abhlib,这很有帮助,我认为如果我对它们进行批处理,我将能够完成我的工作,但现在无法一次性批处理所有数据。