def write(self, ob, *, encoding='utf8', if_exists=None, mode=None, **kwargs): """ 保存为文件 :param ob: 写入的内容 如果要写txt文本文件且ob不是文本对象,只会进行简单的字符串化 :param encoding: 强制写入的编码 如果原文件存在且有编码,则使用原文件的编码 如果没有,则默认使用utf8 当然,其实有些格式是用不到编码信息的~~例如pkl文件 :param if_exists: 如果文件已存在,要进行的操作 :param mode: 写入模式(例如 '.json'),默认从扩展名识别,也可以强制指定 :param kwargs: 写入json格式的时候 ensure_ascii: json.dump默认是True,但是我这里默认值改成了False 改成False可以支持在json直接显示中文明文 indent: json.dump是None,我这里默认值遵循json.dump 我原来是2,让文件结构更清晰、更加易读 :return: 返回写入的文件名,这个主要是在写临时文件时有用 """ # # 将ob写入文件path # def get_enc(): # # 编码在需要的时候才获取分析,减少不必要的运算开销 # # 所以封装一个函数接口,需要的时候再计算 # if encoding is None: # # return self.encoding or 'utf8' # return encoding if self.exist_preprcs(if_exists): self.ensure_parent() name, suffix = str(self), self.suffix if not mode: mode = suffix mode = mode.lower() if mode == '.pkl': with open(name, 'wb') as f: pickle.dump(ob, f) elif mode == '.json': with open(name, 'w', encoding=encoding) as f: DictTool.ior(kwargs, {'ensure_ascii': False}) json.dump(ob, f, **kwargs) elif mode == '.yaml': with open(name, 'w', encoding=encoding) as f: yaml.dump(ob, f) elif isinstance(ob, bytes): with open(name, 'wb') as f: f.write(ob) else: # 其他类型认为是文本类型 with open(name, 'w', errors='ignore', encoding=encoding) as f: f.write(str(ob)) return self
def add_shape(name, refdict, add_keys, drop_keys=('bbox', )): """ 生成一个标注框 """ msgdict = {'category_name': name} msgdict.update(add_keys) DictTool.ior(msgdict, refdict) DictTool.isub(msgdict, drop_keys) bbox = [round_int(v * scale) for v in refdict['bbox']] if 'size' in msgdict: x = round_unit(msgdict['size'], 0.5) msgdict['size'] = round_int( x) if (x * 10) % 10 < 1 else x # 没有小数的时候,优先展示为11,而不是11.0 if 'color' in msgdict: # 把color映射为直观的(r, g, b) # 这个pdf解析器获取的color,不一定精确等于原值,可能会有偏差,小一个像素 v = msgdict['color'] msgdict['color'] = (v // 256 // 256, (v // 256) % 256, v % 256) if 'origin' in msgdict: msgdict['origin'] = [round_int(v) for v in msgdict['origin']] sp = LabelmeDict.gen_shape(json.dumps(msgdict), bbox) shapes.append(sp)
def write_json(self, data, encoding='utf8', **kwargs): with open(self, 'w', encoding=encoding) as f: DictTool.ior(kwargs, {'ensure_ascii': False}) json.dump(data, f, **kwargs)