如何解决Streamlit中调用split()处理上传文件报TypeError的问题
问题原因
Streamlit的file_uploader组件返回的文件类对象调用readlines()方法读取到的每一行内容都是bytes字节类型,而非字符串类型。
你之前的判断逻辑中用ord()将字符转为ASCII码和字节值比对是可以正常运行的,但后续调用split(";")时传入的分隔符是字符串类型,字节对象的split方法仅支持接收字节类型的分隔符,因此触发类型错误。
解决方案
有两种常用的修复方案可选:
方案1:最小改动适配现有逻辑
仅修改split的分隔符为字节类型即可,不需要调整其他代码:
把代码里的
group_new = [[l.split(";") for l in group] for group in group_of_lists]
替换为
group_new = [[l.split(b";") for l in group] for group in group_of_lists]
如果后续处理需要元素为字符串,也可以在split后对每个元素做解码:
group_new = [[s.decode('utf-8') for s in l.split(b";")] for l in group]
方案2:统一转为字符串处理
读取文件后直接将所有行解码为字符串,同时调整之前的判断条件:
# 原代码 eeprom = uploaded_log.readlines() 替换为以下内容 eeprom = [line.decode('utf-8') for line in uploaded_log.readlines()] # 后面的判断条件去掉ord,直接用字符比对 sip_list = [x for x in eeprom if (x[entry_id] == '1' and x[semi_colon] == ';')] slope_list = [x for x in eeprom if (x[entry_id] == '2' and x[semi_colon] == ';')] cal1_list = [x for x in eeprom if (x[entry_id] == '3' and x[semi_colon] == ';')]
这个方案下后续的split(";")不需要修改即可正常运行。
内容的提问来源于stack exchange,提问作者Bence Repasi
相关产品推荐
相关产品推荐

