【发布时间】:2016-10-01 04:11:48
【问题描述】:
我正在编写一个 Python 脚本,该脚本读取 CSV 并使用 cx_Oracle 将内容写入 Oracle 数据库。到目前为止,我一直收到以下错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\xa0' in position 1369: ordinal not in range(128)
显然,cx_Oracle 正在尝试将 Unicode 字符转换为 ASCII,但它不起作用。
几个澄清点:
- 我使用的是 Python 3.4.3
- CSV 文件以 UTF-8 编码,打开方式类似于
open('all.csv', encoding='utf8') - 我在数据库中使用
NVARCHAR2字段作为文本,NLS_NCHAR_CHARACTERSET设置为AL16UTF16。NLS_CHARACTERSET是WE8MSWIN1252,但据我了解,这不相关,因为我使用的是NVARCHAR2。 - 我尝试将
NLS_LANG环境变量设置为.AL16UTF16、_.AL16UTF16和AMERICAN_AMERICA.WE8MSWIN1252等this post,但我仍然遇到同样的错误。
鉴于我正在读取 UTF-8 文件并尝试写入 Unicode 编码表,任何人都可以想到为什么 cx_Oracle 仍会尝试将我的数据转换为 ASCII?
我可以使用此代码产生错误:
field_map = {
...
}
with open('all.csv', encoding='utf8') as f:
reader = csv.DictReader(f)
out_rows = []
for row in reader:
if i == 1000:
break
out_row = {}
for field, source_field in field_map.items():
out_val = row[source_field]
out_row[field] = out_val
out_rows.append(out_row)
i += 1
out_db = datum.connect('oracle-stgeom://user:pass@db')
out_table = out_db['service_requests']
out_table.write(out_rows, chunk_size=10000)
datum 模块是我正在开发的一个数据抽象库。在here找到负责写入Oracle表的函数。
完整的回溯是:
File "C:\Projects\311\write.py", line 64, in <module>
out_table.write(out_rows, chunk_size=10000)
File "z:\datum\datum\table.py", line 89, in write
self._child.write(rows, from_srid=from_srid, chunk_size=chunk_size)
File "z:\datum\datum\oracle_stgeom\table.py", line 476, in write
self._c.executemany(None, val_rows)
UnicodeEncodeError: 'ascii' codec can't encode character '\xa0' in position 1361: ordinal not in range(128)
【问题讨论】:
-
你能提供完整的追溯吗?至少您正在使用的代码的相关部分? cx_Oracle 完全有能力将 Unicode 文本写入数据库!
-
@AnthonyTuinga 我已经添加了一些代码和回溯,在此先感谢!
标签: python oracle unicode utf-8 cx-oracle