我是Python脚本的新手,当我将我的shell脚本转换为Python用于Netezza数据库调用时,其中使用传递的参数调用存储过程。所有内容都按预期工作,并且结果与Shell.But相同例如,如果一个参数为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)
try:
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)
由于 Anoop R
答案 0 :(得分:0)
错误消息表明它无法将字节解析为有效的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)
答案 1 :(得分:0)
此问题可能与UTF-8转换有关。您的结果提交了非unicode,可能导致该问题。试试这个解决方案。
参考:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
Django地区的类似问题。这将让您了解它的来源。