hcsv导入oracle
#coding:gbkimport csvimport cx_Oraclefields = []data = []table_name = \'ygl_test3\'file_name = \'清单.csv\'with open(file_name, \'rb\') as f:reader = csv.reader(f)contents = [i for i in reader]title = contents[0]data = contents[1:]conn = cx_Oracle.connect(\'user/passwd@cd\')cursor = conn.cursor()#生成create table语句中字段名字符串for i in title:fields.append(i+\' varchar2(200)\')fields_str = \', \'.join(fields)sql = \'create table %s (%s)\' % (table_name, fields_str)print sql#根据excel列名创建数据表的字段cursor.execute(sql)#生成executemany语句中的:1,:2字段参数格式a = [\':%s\' %i for i in range(len(title)+1)]value= \',\'.join(a[1:])sql = \'insert into %s values(%s)\' %(table_name, value)print sql#把所有字段插入数据值cursor.prepare(sql)cursor.executemany(None, data)cursor.close()conn.commit()conn.close()
升级版:
#coding:gbkimport cx_Oracleimport csvimport xlrdclass ImportOracle(object):#工厂模式初始化导入函数inoracle,用作读取文件数据def inoracle(self):pass#oracle 连接和写入函数def ConnOracle(self):conn = cx_Oracle.connect(\'user/passwd@cd\')cursor = conn.cursor()#以数字开头的字段加个字符aself.title = [i if i[0].isdigit() == False else \'a\'+i for i in self.title ]fields = [i+\' varchar2(200)\' for i in self.title]fields_str = \', \'.join(fields)sql = \'create table %s (%s)\' % (self.table_name, fields_str)print sqlcursor.execute(sql)a = [\':%s\' %i for i in range(len(self.title)+1)]value= \',\'.join(a[1:])sql = \'insert into %s values(%s)\' %(self.table_name, value)print sqlcursor.prepare(sql)cursor.executemany(None, self.data)cursor.close()conn.commit()conn.close()#ImportOracle的子类,用作导入csv文件的类class ImportOracleCsv(ImportOracle):#重构父类的inoracle函数,用作从csv读取数据,返回标题和内容def inoracle(self):with open(self.filename, \'rb\') as f:reader = csv.reader(f)contents = [i for i in reader]title = contents[0]data = contents[1:]return (title, data)#ImportOracle的子类,用作导入excel文件的类class ImportOracleExcel(ImportOracle):#重构父类的inoracle函数,用作从EXCEL文件读取数据,返回标题和内容def inoracle(self):wb = xlrd.open_workbook(self.filename)sheet1 = wb.sheet_by_index(0)title = sheet1.row_values(0)data = [sheet1.row_values(row) for row in range(1, sheet1.nrows)]return (title, data)#ImportOracle的子类,在文件类型错的情况返回class ImportError(ImportOracle):def inoracle(self):print \'Undefine file type\'return 0#工厂选择类,csv文件返回ImportOracleCsv类,EXCEL文件返回ImportOracleExcel类class ChooseFactory(object):choose = {}choose[\'csv\'] = ImportOracleCsv()choose[\'xlsx\'] = ImportOracleExcel()choose[\'xls\'] = ImportOracleExcel()def choosefile(self, ch):if ch in self.choose:op = self.choose[ch]else:op = ImportError()return opif __name__ =="__main__":#定义文件名和数据库表名file_name = \'清单.xlsx\'table_name= \'ygl_test\'#获取文件类型op = file_name.split(\'.\')[-1]factory = ChooseFactory()#选择工厂类处理,cal被赋值为处理的具体类cal = factory.choosefile(op)#设置类属性(文件名)cal.filename = file_name#根据函数返回值设置类属性(标题,内容)(cal.title, cal.data) = cal.inoracle()#设置类属性(表名)cal.table_name = table_name#调用类的导入数据库函数cal.ConnOracle()
附件列表