如何将Erlang格式字符串列表转为Python列表?遇SyntaxError报错
问题
我在主类中调用了如下函数:
def get_tote_task_ttp_list_not_complete(self, butler_host): try: server_ip = coreApi._env_details['BUTLER_SERVER'] except TypeError: # TypeError is raised when we fetch data from None server_ip = butler_host obj = ErlangArg(server_ip) out = obj.erl_multiple_arg('tote_task', 'search_by', ["[{status, notequal, complete}],[task_key,tote_id]"]) status = out.lstrip('{ok,').rstrip('}').strip('""') return status
主类调用代码:
jai = gmc.get_tote_task_ttp_list_not_complete("172.29.2.54") print(jai) print(type(jai))
输出结果:
[[<<"a29c4601-68a1-40e3-b986-50c8ec65bf18">>,<<"TOTE1">>], [<<"03a89100-18cb-4f06-821b-b368b86f8829">>,<<"TOTE2">>], [<<"8897a38e-cfaf-4983-afc2-fcdcaf7ef59d">>,<<"TOTE10">>]] <class 'str'>
我需要将这个字符串转换为Python列表,期望的结构是:
[<<"a29c4601-68a1-40e3-b986-50c8ec65bf18">>,<<"TOTE1">>],[<<"03a89100-18cb-4f06-821b-b368b86f8829">>,<<"TOTE2">>],[<<"8897a38e-cfaf-4983-afc2-fcdcaf7ef59d">>,<<"TOTE10">>]
尝试用ast.literal_eval()转换时出错:
import ast def get_tote_task_ttp_list_not_complete(self, butler_host): try: server_ip = coreApi._env_details['BUTLER_SERVER'] except TypeError: # TypeError is raised when we fetch data from None server_ip = butler_host obj = ErlangArg(server_ip) out = obj.erl_multiple_arg('tote_task', 'search_by', ["[{status, notequal, complete}],[task_key,tote_id]"]) status = out.lstrip('{ok,').rstrip('}').strip('""') # Convert status string to list status_list = ast.literal_eval(status) return status_list
错误信息:
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ast.py", line 50, in parse return compile(source, filename, mode, flags, File "<unknown>", line 1 [[<<"a29c4601-68a1-40e3-b986-50c8ec65bf18">>,<<"TOTE1">>], ^^ SyntaxError: invalid syntax
如何解决这个问题,成功将目标字符串转换为Python列表?
解决方案
问题核心是Erlang返回的<<"xxx">>格式不是Python合法语法,ast.literal_eval()无法识别。需要先将Erlang二进制字符串格式替换为Python兼容格式,再进行转换。
修改后的函数代码
import ast def get_tote_task_ttp_list_not_complete(self, butler_host): try: server_ip = coreApi._env_details['BUTLER_SERVER'] except TypeError: # TypeError is raised when we fetch data from None server_ip = butler_host obj = ErlangArg(server_ip) out = obj.erl_multiple_arg('tote_task', 'search_by', ["[{status, notequal, complete}],[task_key,tote_id]"]) status = out.lstrip('{ok,').rstrip('}').strip('""') # 替换Erlang二进制字符串格式为Python兼容格式 python_compatible_str = status.replace('<<', '').replace('>>', '') # 转换为Python列表 status_list = ast.literal_eval(python_compatible_str) # 若需要生成期望的逗号分隔子列表格式,可执行以下操作 desired_output = str(status_list)[1:-1] return status_list # 按需返回Python列表或desired_output格式字符串
关键步骤说明
- 格式替换:将字符串中的
<<"和">>替换为空,让<<"TOTE1">>变为"TOTE1",符合Python字符串语法规则。 - 列表转换:修改后的字符串可被
ast.literal_eval()正常解析,得到可操作的Python列表。 - 生成目标格式:如果需要得到指定的逗号分隔子列表格式,只需将转换后的列表转为字符串,再去掉最外层的
[和]即可。
内容的提问来源于stack exchange,提问作者Jaideep Kaushik
相关产品推荐
相关产品推荐

