Gravando dados de um arquivo CSV no Oracle utlizando Python e a biblioteca cx_Oracle

Tive uma certa complicação ao inserir dados no Oracle vindo de um arquivo CSV.

O problema, é que o arquivo que vinha os dados tinha uma formatação diferente de UTF-8.
Sempre que tentava gravar a linha vinda do arquivo dava o erro:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position XX: ordinal not in range(128)

Como cada caso é um caso, pode ser que ao abrir o arquivo com formatação UTF-8, funcione. Mas nem sempre.
with open(csv_file, encoding='utf-8') as csv_file:
 csv_reader = csv.reader(csv_file, delimiter=';')

 for lines in csv_reader:
Porém meu caso foi mais específico. Não dava certo utilizando esse método. Após algum tempo pesquisando, descobri que era necessário abrir a conexão com o banco com as opções encoding nencoding habilitadas com UTF-8. Segue o código:
dsn_tns = cx_Oracle.makedsn(hostname, portnumber, service_name)
con = cx_Oracle.connect(user='user', password='123465', dsn=dsn_tns, encoding='UTF-8', nencoding='UTF-8')
curr = con.cursor()

with open(csv_file, encoding='utf-8') as csv_file:
 csv_reader = csv.reader(csv_file, delimiter=';')

 for lines in csv_reader:
  cur.execute("insert into tableX (column1, column2) values (:1, :2)", lines)
Com isso foi possível gravar a linha direta do arquivo CSV no banco de dados!

Comentários

Postagens mais visitadas deste blog

Popup em JSF sem Javascript

Utilizando um pool de conexões com hibernate

Criando um arquivo para download