Мне нужно вставить несколько записей в OracleDB с помощью cx_ Oracle, однако я столкнулся с приведенной ниже ошибкой для некоторых записей из-за присутствия в моих данных не-ASCII-символов (некоторые символы и т. Д. c.).
При чтении входного файла 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
Traceback (последний вызов был последним):
File " ", строка 3, в cursor.executemany (insert_query, db_data [i: i + 1])
UnicodeEncodeError: код 'ascii' c не может кодировать символ '\ xa0' в позиции 20: порядковый номер вне диапазона (128)