我很难将包含非ASCII字符的pandas.DataFrame
的值写入Oracle数据库。这是一个可重现的示例(给定一个真实的连接字符串):
import pandas as pd
from sqlalchemy import create_engine, Unicode, NVARCHAR
connection_string = oracle://<name>:<password>@<database>'
df = pd.DataFrame([
['Société Générale']
], columns=['firm'])
conn = create_engine(connection_string, encoding='utf-8')
dtypes = {'firm': Unicode(40)}
df.to_sql('test', con=connection_string, dtype=dtypes, if_exists='replace')
产生的错误类似于
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 4: ordinal not in range(128)
我想问题是如何在编写时使用UTF-8编码。我知道encoding
中create_engine
的默认值为utf-8'
,我认为它会控制所使用的编码。
我也试过了dtypes = {'firm': NVARCHAR(40, convert_unicode=True)}
但是得到了同样的错误。
我尝试在写入之前对数据进行编码(df['firm'] = df.firms.str.encode('utf-8')
),这确实解决了这个问题,只会导致更大的问题。
这似乎是一个直截了当的问题,但我花了几个小时看文档和SO,无法弄清楚要做什么。
使用的版本是; Python: 3.6
,pandas: 0.20
,sqlalchemy: 1.11
答案 0 :(得分:1)
这是一个古老的问题,但我最近遇到了同样的问题,并找到了适合我的解决方案。
我必须设置
os.environ['NLS_LANG'] = ".AL32UTF8"
它对我有用。但是我发现插入数据非常慢。