UnicodeEncodeError: код 'ascii' c не может закодировать символ '\ u2019' в позиции 41: порядковый номер не в диапазоне (128) CX_ ORACLE ВСТАВИТЬ ОШИБКУ - PullRequest
0 голосов
/ 27 января 2020

Мне нужно вставить несколько записей в 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...