CSVで読み込むPythonスクリプトで作業していますが、cx_Oracleを使用して内容をOracleデータベースに書き出します。これまでのところ、私は次のエラーを取得してきた:cx_Oracleを使用してUnicodeテキストを書き込めません
明らかUnicodeEncodeError: 'ascii' codec can't encode character '\xa0' in position 1369: ordinal not in range(128)
、cx_OracleはASCIIにUnicode文字を変換しようとしている、それが働いていません。
少数の明確化のポイント:
- 私はCSVファイルは、私が
NVARCHAR2
フィールドを使用しているUTF-8でエンコードされ、open('all.csv', encoding='utf8')
- のように開かれているのPython 3.4.3
- を使用しています
NLS_NCHAR_CHARACTERSET
はAL16UTF16
に設定されています。NLS_CHARACTERSET
はWE8MSWIN1252
ですが、私はNVARCHAR2
を使用しているので、これは関係ないはずです。 - 私は
.AL16UTF16
,_.AL16UTF16
、に環境変数NLS_LANG
を設定しようとしましたが、同じエラーが発生します。私は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:[email protected]')
out_table = out_db['service_requests']
out_table.write(out_rows, chunk_size=10000)
datum
モジュールは、私が働いているデータ抽象化ライブラリです。 Oracle表への書き込みを行う関数は、hereです。
フルトレースバックは、次のとおりです。
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テキストをデータベースに完全に書くことができます! –
@AnthonyTuiningaいくつかのコードとトレースバックを追加しました。ありがとうございます! – Rob