使用Python的Shareplum模块向SharePoint插入特殊字符数据失败
你在Python 2.7环境下用Shareplum插入带È、É这类特殊字符的数据到SharePoint时碰到的编码错误,根源很清晰:Shareplum源码里的str(value)调用处理Unicode字符时默认用ASCII编码,而这些特殊字符超出了ASCII的范围。
下面给你两个可行的解决方案:
方案1:修改Shareplum源码(快速临时修复)
直接找到Shareplum的shareplum.py文件(路径是/usr/lib64/python2.7/site-packages/shareplum/shareplum.py),定位到add_actions方法里的第761行左右:
field.text = str(value)
把这行改成:
field.text = value.encode('utf-8')
这样就会用UTF-8编码Unicode字符串,SharePoint完全支持UTF-8格式的文本,就能直接避免编码错误了。
⚠️ 注意:这种修改会被后续的Shareplum版本更新覆盖,如果需要长期维护代码,更推荐方案2。
方案2:在自己的代码里预处理数据(更稳妥)
在把request_data_list传给Shareplum之前,提前把所有Unicode字符串编码成UTF-8的字节流。可以写一个递归处理函数来遍历你的数据结构:
def encode_unicode_to_utf8(data): if isinstance(data, unicode): # 将Unicode字符串转成UTF-8字节 return data.encode('utf-8') elif isinstance(data, list): # 递归处理列表里的每个元素 return [encode_unicode_to_utf8(item) for item in data] elif isinstance(data, dict): # 递归处理字典的键和值 return {encode_unicode_to_utf8(k): encode_unicode_to_utf8(v) for k, v in data.items()} else: # 非字符串类型直接返回 return data # 预处理请求数据 request_data_list = encode_unicode_to_utf8(request_data_list) # 再调用插入方法 sp_list.UpdateListItems(data=request_data_list, kind='New')
这个方法不需要修改第三方库的源码,更利于代码的可维护性,还能确保所有特殊字符都被正确编码。
错误原因解析
在Python 2.7中,str()函数如果传入Unicode字符串,会尝试用默认的ASCII编码去转换,而È(U+00C8)、É(U+00C9)这些字符的编码值不在ASCII的0-127范围内,所以就抛出了UnicodeEncodeError。而SharePoint支持UTF-8编码,只要我们用UTF-8来处理这些字符就能解决问题。
内容的提问来源于stack exchange,提问作者Aditi

