我必须使用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)
目前没有回答
相关问题 更多 >
编程相关推荐