Oracle 熊猫通过SQL炼金术:Unicodeincodeerror:';ascii';编解码器可以';t编码字符

Oracle 熊猫通过SQL炼金术:Unicodeincodeerror:';ascii';编解码器可以';t编码字符,oracle,python-3.x,sqlalchemy,Oracle,Python 3.x,Sqlalchemy,使用熊猫18.1 我试图遍历CSV文件夹,读取每个CSV并将其发送到Oracle数据库表。在我的众多CSV中,有一个非ascii字符潜伏在其中(更像是陶醉于我的痛苦之中)。我不断地发现这个错误: UnicodeEncodeError: 'ascii' codec can't encode character '\xab' in position 8: ordinal not in range(128) 代码如下: import pandas as pd import pandas.io.sq

使用熊猫18.1

我试图遍历CSV文件夹,读取每个CSV并将其发送到Oracle数据库表。在我的众多CSV中,有一个非ascii字符潜伏在其中(更像是陶醉于我的痛苦之中)。我不断地发现这个错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xab' in position 8: 
ordinal not in range(128)
代码如下:

import pandas as pd
import pandas.io.sql as psql
from sqlalchemy import create_engine
import cx_Oracle as cx

engine = create_engine('oracle+cx_oracle://schema:'+pwd+'@server:port/service_name'
,encoding='latin1')

name='table'
path=r'path_to_folder'
filelist = os.listdir(path) 

for file in filelist:
    df = pd.read_csv(pathc+'\\'+file,encoding='latin1',index_col=0)
    df=df.astype('unicode')
    df['date'] = pd.to_datetime(df['date'])
    df['date'] = pd.to_datetime(df['Contract_EffDt'],format='%YYYY-%mm-%dd')
    df.to_sql(name, engine, if_exists = 'append')
我尝试了以下方法:

  • encoding=utf-8(在引擎中,如果我在read_csv中这样做,它会抛出一个错误)
  • 在引擎中的“服务名称”之后添加?encoding=utf8
  • 使用df=df.astype('unicode')(而不是)
  • 我想做什么: 将无法读取的字符替换为其他字符,最重要的是,继续向Oracle发送数据

    注:

    我使用的数据文件来自cms.gov网站。我正在使用“合同信息”文件


    提前谢谢

    我将字符串字段单独编码为utf-8,这可能有所帮助(出现了新错误,但我认为这与此无关):

    新错误:

    DatabaseError: (cx_Oracle.DatabaseError) ORA-00904: "Contract_ID": invalid identifier
    

    这是因为没有将“Contract_ID”设置为索引。一旦我这样做了,一切都很顺利(除了比糖蜜慢,这是我下一次冒险的开始)。

    您需要如下设置NLS_LANG环境变量:

    os.environ['NLS_LANG']= 'AMERICAN_AMERICA.AL32UTF8'
    
    这样就不会发生错误

    os.environ['NLS_LANG']= 'AMERICAN_AMERICA.AL32UTF8'