【问题标题】:Python 3 - CSV and cx_OraclePython 3 - CSV 和 cx_Oracle
【发布时间】:2013-12-29 09:38:30
【问题描述】:

我在使用 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)

这会将所有内容保存到二维数组中。 每当我想在数据库中插入一些东西时,我都会做一个准备好的语句,然后将文本加载到其中:

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 我在尝试执行准备好的语句时遇到编码错误

【问题讨论】:

  • 显示回溯。哪一行产生了错误?
  • cursor.execute 给了我错误 (cursor.execute(None, data))
  • PRIVATE 表的架构是什么?您使用了哪些列类型?
  • 列类型为 VARCHAR2

标签: python oracle csv cx-oracle


【解决方案1】:

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

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

要么手动将您的值编码为合适的编码,要么让您的列使用NVARCHAR2

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

【讨论】:

  • 我该如何做你建议的第一个解决方案?以及如何查看我应该使用的正确编码方法?
  • 我试过这个 for row in csvinput: for cell in row: cell = str.encode(cell, encoding = 'iso-8859-1') 但这也不起作用......
  • Oracle 在编码方面特别困难。我认为,您必须设置 NLS_LANG environment parameter 以匹配您正在使用的编解码器。但是将VARCHAR2 用于编码的 unicode 文本有很大的缺点,尤其是它使得查询特定的字符串值变得非常困难。
猜你喜欢
  • 2018-05-13
  • 1970-01-01
  • 2019-02-11
  • 2011-07-08
  • 2012-03-12
  • 2017-06-03
  • 2015-01-10
  • 2017-02-16
  • 1970-01-01
相关资源
最近更新 更多