Python布尔值保存后加载异常:bool()转换始终返回True求助
解决Python布尔值保存与加载时的转换问题
问题出在bool()函数的工作逻辑上:在Python中,任何非空字符串传入bool()都会返回True,不管字符串内容是"True"还是"False"。你保存时把布尔值转成了字符串形式,读取后直接用bool()转换,自然会得到始终为True的结果。
修复方案
有两种简单可靠的修复方式:
方式1:字符串匹配直接转换
读取到字符串后,通过判断内容是否等于"True"来赋值布尔值:
testbool = loaded_list[0] == "True"
方式2:用ast.literal_eval()解析原类型
如果以后要保存更多复杂类型(比如数字、列表),这种方法扩展性更好,它能安全地把字符串解析回原Python对象:
import ast testbool = ast.literal_eval(loaded_list[0])
修改后的完整代码
同时优化了文件操作(用with语句自动关闭文件,避免资源泄漏),并避免使用Python内置关键字list作为变量名:
menu = True testbool = False def save(): with open("testsave.txt", "w") as f: save_list = [str(testbool)] for item in save_list: f.write(item) print(testbool) while menu: ans = input("Hello 1 or 2?\n") if str(ans) == "1": print("Hello World!!") save() menu = False run = True if str(ans) == "2": print(testbool) with open("testsave.txt", "r") as f: loaded_list = [line.rstrip('\n') for line in f.readlines()] print(testbool) # 这里替换成方式1的代码 testbool = loaded_list[0] == "True" # 或者用方式2:先import ast,再用下面的代码 # testbool = ast.literal_eval(loaded_list[0]) print(testbool) if ans == "4": quit() menu = False run = True while run: print("Hello World") save() ans = input("4?") if ans == "4": quit()
额外说明
- 用
with语句处理文件是Python的最佳实践,它会在代码块结束后自动关闭文件,不需要手动调用close() - 避免使用
list、str这类Python内置类型名作为变量名,会覆盖内置功能导致潜在问题
内容的提问来源于stack exchange,提问作者HyperGG
相关产品推荐
相关产品推荐

