pyodbc Кодек Netezza 'ascii' не может кодировать символы в позиции 0-2: порядковый номер не в диапазоне (128)

Я новичок в написании сценариев на Python, и когда я преобразовывал свои сценарии оболочки в Python для вызова Netezza DB, в котором хранимая процедура вызывается с переданными аргументами. Все работает так, как ожидалось, и дает результат такой же, как Shell. Параметр имеет значение null, он будет считывать эти данные из таблицы Netezza (поле Varchar). Пока я тестировал этот сценарий и пытался распечатать результат, прочитанный из, я получил странную ошибку, говорящую: «кодек ascii не может кодировать символы в позиции 0 -2: порядковый номер не в диапазоне (128). Я пытался преобразовать значение в строку, но это не работает. Прикрепляю скрипт для ознакомления. Примечание. Сценарий может не соответствовать стандартам Python. Принимайте любые предложения по улучшению кода.

связь

    try:
    conn_str   ="DRIVER={NetezzaSQL};SERVER="+results.host+";PORT=5480;DATABASE="+results.sugarDB+";UID="+results.username+";PWD="+results.password+""
    print conn_str
    conn_sugar = pyodbc.connect(conn_str,ansi=True)

    cur_sugar = conn_sugar.cursor()
    if (conn_sugar):
        print "Connection successful"

except Exception, e:

    print "Error while creating Netezza connection Error:",e

    sys.exit(-1)   

чтение данных из таблицы Netezza

try:

проверка нулевого списка параметров dim

    if str(results.dimList)=="":
        print "dimlist is  null"

        var_query="select  LP.DIMENSIONS AS DIMENSIONS from PICASO..LKP_PX_RECOMMEND_METADATA LP where LP.client_id="+results.clientID+""
        print var_query
        for row in cur_sugar.execute(var_query):
            print "line no 62"
            print row.DIMENSIONS 
        conn_sugar.commit();            
    else:
        print "dimlist is not null",results.dimList
        v=results.dimList

    cur_sugar.execute("{exec SQLTOOLKIT..UDP_PRC_GET_MEDIAPLAN_RECOMMENDATION_3004("+results.clientID+","+results.configID+","+results.jobinstanceID+",'"+results.convBegin+"','"+results.convEnd+"','"+results.jaMeta+"','"+results.sugarDB+"','"+results.dimList+"','"+results.flag+"')}")
    conn_sugar.commit();
    conn_sugar.close();
except Exception, e:
    print "procedure call failed!!! Error :",e

Ошибка прихода

вызов процедуры не удался!!! Ошибка: кодек ascii не может кодировать символы в позиции 0-2: порядковый номер не в диапазоне (128)

Спасибо, Ануп Р.


person Anoop R    schedule 06.10.2015    source источник


Ответы (2)


В сообщении об ошибке говорится, что он не может разобрать байты в допустимую строку ascii. Декодирование для байтов имеет возможность обрабатывать ошибки. Вы можете «игнорировать» или «заменить». 'replace' поместит символ вопроса там, где исходные байты не могут быть проанализированы в ascii.

value = b''
val_str = value.decode("ascii", 'ignore')

Думайте о порядковом номере как о десятичном числе в байтах для поиска таблицы ascii. http://www.asciitable.com/

value = bytes([97]) # a
val_str = value.decode("ascii", "ignore")
print(val_str)
person justengel    schedule 06.10.2015
comment
Спасибо за ответ. Я попробую предложенное вами решение. Я не понимаю, почему поле varchar не читается python odbc. Прикрепил код для справки. - person Anoop R; 06.10.2015
comment
Я попробовал это, и он возвращает ту же ошибку, кодек ascii не может кодировать символы в позиции 0-2: порядковый номер не в диапазоне (128) - person Anoop R; 06.10.2015
comment
@ScottMcG Поделитесь своими мыслями, если вы столкнулись с такой же проблемой - person Anoop R; 09.10.2015
comment
Я предполагаю, что есть проблема с библиотекой, которую вы используете. conn_sugar/pyodbc может содержать ошибку. Если это собственный код Python, вы можете углубиться в исходный код и попытаться исправить его, перейдя по ссылкам из ошибки трассировки (не перехватывайте ошибку и не позволяйте ей печатать на консоли). Если вы разрабатываете с помощью eclipse, вы можете выполнить отладку и попытаться следовать команде выполнить/фиксировать, или вы можете выделить выполнение и нажать F3 (Открыть объявление), чтобы узнать, где находится этот код и что он делает. F3 может не работать для кода некоторых библиотек. - person justengel; 09.10.2015

Эта проблема может быть связана с преобразованием UTF-8. В вашем файле результатов есть файл, отличный от Unicode, и это может быть причиной проблемы. Попробуйте это решение.

pyodbc удалить строки unicode

См.: UnicodeDecodeError: кодек ascii может t декодировать байт 0xd1 в позиции 2: порядковый номер не в диапазоне (128)

Аналогичная проблема в районе Джанго. Это даст вам представление о том, откуда оно взялось.

person Bimal    schedule 08.10.2015
comment
Bimal В определении таблицы я использовал Varchar, а не nvarchar. Например, я сохраняю значение «Custom1» в этом поле без других специальных символов. В любом случае, я уже пробовал все параметры декодирования, но это не решило проблему. Это связано с драйвером Netezza Метод кодирования Я не уверен. В сценарии оболочки мы напрямую извлекаем значение этого столбца в переменную без каких-либо проблем. - person Anoop R; 08.10.2015