示例#1
0
    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
示例#2
0
        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)
示例#3
0
 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)