Python中使用NestedText遇报错?空文件场景问题排查
NestedText调用报错问题分析与修复
问题场景
使用NestedText库编写的Python代码如下:
import nestedtext as nt def nestedText(self, reading=True, path="reviews.nt"): if reading == True: return nt.load(path) elif reading != True: nt.dump(reading, path) return self.nestedText(path=path)
执行nestedText([])时触发报错,报错栈:
return self.nestedText(path=path) > return nt.load(self.fil[path]) > loader = NestedTextLoader(fp, top, source, on_dup, keymap, normalize_key) > report('content must start with key or brace ({{).', lines.get_next()) > raise NestedTextError(template=message, *args, **kwargs) > File "<string>", line 0 nestedtext.nestedtext.NestedTextError
初始文件为空且路径正确。
错误原因
参数职责混淆:
函数用reading参数同时充当「读写模式开关」和「写入数据载体」,逻辑设计混乱。传入[]时,reading被当作写入数据处理,但后续递归调用默认以读模式加载文件,触发格式校验错误。违反NestedText格式规范:
NestedText要求顶层结构必须是键值对字典,或用{{ ... }}包裹的列表/字典。直接dump未包裹的列表[]会生成无效内容,导致加载时触发「内容必须以键或大括号开头」的错误。冗余递归调用:
写入完成后递归调用读取方法完全没必要,反而因写入的无效内容触发报错。
修复方案
1. 重构函数参数
拆分参数,分离读写控制与写入数据,避免逻辑混淆:
import nestedtext as nt def nested_text(self, read=True, path="reviews.nt", data=None): if read: return nt.load(path) else: # 写入列表时指定top="list",自动用{{}}包裹,符合格式规范 nt.dump(data, path, top="list") # 如需验证写入结果,可单独调用读取,无需递归 # return self.nested_text(path=path) return "数据写入成功"
2. 正确调用方式
- 读取数据:
self.nested_text() - 写入列表:
self.nested_text(read=False, data=[])
3. 额外说明
如果需要写入字典,可直接调用nt.dump(data, path)(字典为NestedText默认支持的顶层结构);若需自定义顶层包裹方式,可通过top参数指定为list或dict。
内容的提问来源于stack exchange,提问作者Pranit Shah
相关产品推荐
相关产品推荐

