Python 3 - CSV和cx_Oracle

时间:2013-12-11 12:07:42

标签: python oracle csv cx-oracle

我在使用csv和cx_oracle模块时遇到了一些麻烦。我想读一个以UTF-8保存的csv文件(我通过用UTF-8中的记事本保存它来检查它)。我现在可以读得很好(在我把它保存为UTF-8之前它没有)。这是我读取csv文件的代码:

 with open(file, 'rt', encoding='utf-8') as csvfile:
    csvinput = csv.reader(csvfile, delimiter = ',', quotechar = '"')
    for row in csvinput:
        data.append(row)

这会将所有内容保存到2D阵列。 每当我想在数据库中插入一些东西时,我都会做一个准备好的声明,并将文本加载到其中:

data = [lastname, firstname]
cursor = cx_Oracle.Cursor(connection)
cursor.prepare("SELECT * FROM PRIVATE WHERE NAME = :1 AND FIRSTNAME = :2")
cursor.execute(None, data)
res = cursor.fetchall()
cursor.close()

它给了我很多错误,如:

UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 1: ordinal not in range(128)

我试着阅读整篇文章,但我对unicode事情感到困惑,因为我真的不知道应该在哪里使用什么以及为什么...... 任何帮助表示赞赏。 TLDR 我在尝试执行预准备语句时遇到编码错误

1 个答案:

答案 0 :(得分:1)

您正在尝试将Unicode值插入VARCHAR2列,该列只能处理编码的字节字符串。

cx_Oracle正在尝试对您的Unicode值进行编码以适合列类型,并使用默认的编解码器进行连接。

手动将您的值编码为合适的编码,或者改为使用NVARCHAR2列。

后者的另一个优点是列长度以字符表示,而不是字节; UTF-8数据每个字符最多可以使用4个字节,因此在最坏的情况下,VARCHAR2(1000)列只能容纳250个实际字符。