UnicodeEncodeError:“ascii”编解码器无法对位置41中的字符“\u2019”进行编码:序号不在范围内(128)CX_uu9Oracle插入错误

2024-04-19 16:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须使用cx_Oracle在OracleDB中插入几条记录,但是,由于数据中存在非ASCII字符(一些符号等),我遇到了一些记录的以下错误

我在读取输入excel文件时尝试了以下方法

data=pd.read_excel(os.path.join(DATA_PATH,fname))
data=pd.read_excel(os.path.join(DATA_PATH,fname),encoding='utf-8')
data=pd.read_excel(os.path.join(DATA_PATH,fname),encoding=sys.getfilesystemencoding())

后来,我尝试清理数据,使其与我的数据库模式兼容

#Cleaning for numeric, string and Unicode
data._get_numeric_data().fillna(0,inplace=True)
for col in data.select_dtypes(include='object').columns:
   #data[col]=data[col].str.strip()
   data[col]=data[col].values.astype('unicode')
data.fillna('',inplace=True)
data.replace({r'\u':''},inplace=True)

#Generating query statement
insert_columns='"'.join(data.columns.tolist())
insert_columns='("'+'","'.join(data.columns.tolist())+'")'
bind_variables='(:'+ ",:".join([str(x) for x in list(range(1,len(data.columns)+1))])+')'
insert_query="INSERT INTO " + table_map[source]+" "+ insert_columns + ' VALUES '+ bind_variables 

db_data=list(data.iloc[:,:].itertuples(index=False, name=None))

#Converting to native python dtypes
for row in db_data:
    for item in row:
        if type(item)==np.int64:
            item=int(np.int64(item).item())
        if type(item)==np.float64:
            item=float(np.float64(item).item())     

#Inserting data #1
for i in range(len(db_data)+1):
    print(i)
    cursor.executemany(insert_query, db_data[i:i+1])

#Inserting data #2
cursor.executemany(insert_query, db_data[:])

然而,最终,我在一些记录中遇到了相同的Unicode错误。 在python对象中,我将这些设置为非ASCII,但无法将它们过滤掉

In [152]: db_data[10:11][-1][-1]
Out[152]: 'PO3005544, PO3005729\xa0'

In [153]: print(db_data[10:11][-1][-1])
PO3005544, PO3005729 

In [154]: data.iloc[10:11,-1]
Out[154]: 
10    PO3005544, PO3005729 
Name: AMENDMENT_DESCRIPTION, dtype: object

In [155]: data.iloc[10:11,-1].values
Out[155]: array(['PO3005544, PO3005729\xa0'], dtype=object)

In [157]: data.iloc[10:11,-1].values[-1][-1]
Out[157]: '\xa0'

In [158]: len(data.iloc[10:11,-1].values[-1][-1])
Out[158]: 1

回溯(最近一次呼叫最后一次):

文件“”,第3行,在 cursor.executemany(插入查询,数据库数据[i:i+1])

UnicodeEncodeError:“ascii”编解码器无法对位置20中的字符“\xa0”进行编码:序号不在范围内(128)


Tags: columnsinfordbdatacoloutitem