Configobj-python处理.ini文件单元素项的读写异常求助
Configobj 读写.ini单元素值的问题解决办法
嘿,刚接触Configobj遇到这种坑太正常了,我来帮你把问题拆解开,一步步解决:
问题1:单元素被拆成单个字符输出
你现在用", ".join(para['name'])的时候踩了个小坑——如果.ini里的name是单值(比如hello1),Configobj会把它解析成字符串,而不是列表。join方法会把字符串当成字符数组来遍历,自然就把每个字符拆开输出了(比如hello变成h,e,l,l,o)。
解决办法
读取时先判断值的类型,如果是单值就包装成单个元素的列表,再用join:
from configobj import ConfigObj config = ConfigObj('para_file.ini') para = config['Parameters'] # 写个小工具函数处理单值/列表兼容 def safe_get_list(key): val = para[key] return val if isinstance(val, list) else [val] # 现在打印就正常了 print(", ".join(safe_get_list('name'))) print(", ".join(safe_get_list('type'))) print(", ".join(safe_get_list('value')))
如果想一劳永逸让Configobj把所有值都解析成列表,可以初始化的时候加list_values=True参数:
config = ConfigObj('para_file.ini', list_values=True)
这样不管.ini里是单值还是多值,都会变成列表,读取时直接用join就行。
问题2:写入单元素时末尾出现多余逗号
你写入时用split(",")处理字符串,哪怕是单元素(比如'hello1'),split后也会得到['hello1']这个列表。Configobj在写入列表的时候,哪怕只有一个元素,也会自动加逗号,所以最终.ini里会出现name = hello1,这种格式。
解决办法
判断处理后的列表长度,如果是1个元素,就直接赋值成字符串;如果是多个元素,再保留列表:
from configobj import ConfigObj config = ConfigObj('para_file.ini') para = config['Parameters'] # 处理name new_names = 'hello1' name_items = [x.strip() for x in new_names.split(",")] para['name'] = name_items[0] if len(name_items) == 1 else name_items # 处理type new_types = '3.1' type_items = [x.strip() for x in new_types.split(",")] para['type'] = type_items[0] if len(type_items) == 1 else type_items # 处理value new_values = '4' value_items = [x.strip() for x in new_values.split(",")] para['value'] = value_items[0] if len(value_items) == 1 else value_items config.write()
这样写入后,单元素就会变成name = hello1,多元素才会带逗号,完美符合你的需求。
内容的提问来源于stack exchange,提问作者pyPN
相关产品推荐
相关产品推荐

