对象 |字典|json|yaml|字符串 相互转化

在研究 k8s 的yaml 配置文件的时候,我总担心自己一不小心 会写错,所以我向往 使用将对象 序列化 yaml 的形式,

其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!

这里 会经常用到几个 函数 vars() ast.

import  ast
dict_str='****'
real_dict=ast.literal_eval(dict_str)
## 可以处理  键没有 引号  或者键是单引号, json 转dict ,只能处理 键是双引号的

我们先尝试用最笨的方法 实现 object到yaml 的转化
在python对象 convert to dict 的形式,使用 vars()函数

然后 dict convert to json 使用 json.dumps(dict)函数

然后 json converte to yaml 使用 ya= yaml.load(json.dumps(dict)) 然后
再 yaml.safe_dump(ya,default_flow_style=False)

至此我们看到 从 python Object ---> dict ----> json ---> yaml 的转化

其中 obj dict json yaml 转 string ,只要 str()函数即可,或者 str(vars())结合

yaml 格式 写入到文件 ,需要注意的是, open()函数 的mode 一定要是 'w' ,不能是’wb', b代表是二进制写入
yaml 写入的是dict str,使用 ‘wb' 会报错,[yaml TypeError: a bytes-like object is required, not 'str']
【出现该错误往往是通过open()函数打开文本文件时,使用了‘rb’属性,如:fileHandle=open(filename,'rb'),则此时是通过二进制方式打开文件的,所以在后面处理时如果使用了str()函数,就会出现该错误,该错误不会再python2中出现。

具体解决方法有以下两种:

第一种,在open()函数中使用‘r’属性,即文本方式读取,而不是‘rb’,以二进制文件方式读取,可以直接解决问题。

第二种,在open()函数中使用‘rb’,可以在使用之前进行转换,有以下实例,来自:http://stackoverflow.com/questions/33054527/python-3-5-typeerror-a-bytes-like-object-is-required-not-str

    
    import  yaml
    import  json
    objdict=vars(Ojbect.instance)
    data=json.dumps(objdict)
    ya=yaml.load(data)
    filey='/Users/geo/Documents/etl_ml/etl_ml/data/demos.yaml'
    stream = open(filey, 'w')
    yaml.safe_dump(ya,stream,default_flow_style=False)

其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!
比如我已经定义了一个 Dog python class,他有 好几个属性 并已经赋值初始化了

import json
import  yaml


class  Dag:

  def __init__(self):
    self.apiVersion="apps/v1beta1"
    self.kind='Deployment'
    wifi_arr=['geo','tmtl','father']
    self.metadata=wifi_arr
    ports_Arr=[{'containerPort':8080}]
    self.ports=ports_Arr

    dic={'app': {
        "containers": [
          {
            "name": "springboot-demo",
            "image": "springboot-demo",
            "imagePullPolicy": "IfNotPresent",
            "ports": [
              {
                "containerPort": 8080
              }
            ]
          }
        ]
      }}
    #print(str(dic))
    self.di=dic
    meta_Dict={'name':'springboot-demo-deployment','labels':dic}
    self.metadata=meta_Dict

另外生成 yaml 对象


if __name__ == '__main__':
    da=Dag()
###
    yaml_format=yaml.safe_dump(da.__dict__,default_flow_style=False)

    print( yaml_format)

生成yaml文件

if __name__ == '__main__':
    dog=Dag()
    file = 'data/demo.yaml'
    stream = open(file, 'w')
###重点!!! 生成 yaml 文件
    yaml.safe_dump(dog.__dict__, stream=stream,default_flow_style=False)

结果是

apiVersion: apps/v1beta1
di: &id001
  app:
    containers:
    - image: springboot-demo
      imagePullPolicy: IfNotPresent
      name: springboot-demo
      ports:
      - containerPort: 8080
kind: Deployment
metadata:
  labels: *id001
  name: springboot-demo-deployment
ports:
- containerPort: 8080

反过来 yaml ----> json ---> 持久化 json 文件 indent=1属性是为了让 json 不以单行展示,而是展开
注意的是 python 的 dict 和set 很相似 ,都是 { }, set 里是list, dict 是键值对
【# set object is not JSON serializable [duplicate]


    yaml_file = yaml.load(data)
    json_file='/data/demo.json'
     json_file2='/data/demo2.json'
    #json持久化 1
    with open(json_file,'w') as fp:
      fp.write(json.dumps(yaml_file,indent=1))
    # json持久化 2
    with open(json_file2, 'w') as fp:
      json.dump(yaml_file, fp,indent=1)

打开 demo.json

{
 "apiVersion": "apps/v1beta1",
 "kind": "Deployment",
 "metadata": {
  "name": "springboot-demo-deployment",
  "labels": {
   "app": {
    "containers": [
     {
      "name": "springboot-demo",
      "image": "springboot-demo",
      "imagePullPolicy": "IfNotPresent",
      "ports": [
       {
        "containerPort": 8080
       }
      ]
     }
    ]
   }
  }
 },
 "ports": [
  {
   "containerPort": 8080
  }
 ],
 "di": {
  "app": {
   "containers": [
    {
     "name": "springboot-demo",
     "image": "springboot-demo",
     "imagePullPolicy": "IfNotPresent",
     "ports": [
      {
       "containerPort": 8080
      }
     ]
    }
   ]
  }
 }
}

image.png

yaml ---> dict

    objdict = vars(self)
    data = json.dumps(objdict)
    yaml_file = yaml.load(data)
    fl=json.dumps(yaml_file,indent=1)
    dict=json.loads(fl)

yaml ---> python object

json --> dict
json.loads()

dict--> json
json.jumps()

str ---> dict
newdict=dict(str)

json -- > python object

一个python object无法直接与json转化,只能先将对象转化成dictionary,再转化成json;对json,也只能先转换成dictionary,再转化成object,通过实践,源码如下:

yaml --> python object
对yaml,也只能先转换成json --->dictionary,再转化成object,通过实践,源码如下:

dict -- ->python object

python对象 默认都有一个 私有的属性 dict 取值 就是 object的 字典形式, 赋值就就可以给对象属性对应赋值

  object._dict_

例如json 转 对象

    j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'
    dict = json.loads(s=j)
    stu = Student()
    stu.__dict__ = dict

对象 转 json

import json

def obj_to_json():
    stu = Student('007', '007', 28, 'male', '13000000000', '123@qq.com')
    print(type(stu))  # <class 'json_test.student.Student'>
    stu = stu.__dict__  # 将对象转成dict字典
    print(type(stu))  # <class 'dict'>
    print(stu)  # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}
    j = json.dumps(obj=stu)
    print(j)  # {"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}


if __name__ == '__main__':
    obj_to_json()

Python之dict(或对象)与json之间的互相转化
在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作。

在Python中自带json库。通过import json导入。

在json模块有2个方法,

loads():将json数据转化成dict数据
dumps():将dict数据转化成json数据
load():读取json文件数据,转成dict数据
dump():将dict数据转化成json数据后写入json文件
下面是具体的示例:

dict字典转json数据

import json

def dict_to_json():
    dict = {}
    dict['name'] = 'many'
    dict['age'] = 10
    dict['sex'] = 'male'
    print(dict)  # 输出:{'name': 'many', 'age': 10, 'sex': 'male'}
    j = json.dumps(dict)
    print(j)  # 输出:{"name": "many", "age": 10, "sex": "male"}


if __name__ == '__main__':
    dict_to_json()

对象转json数据

import json

def obj_to_json():
    stu = Student('007', '007', 28, 'male', '13000000000', '123@qq.com')
    print(type(stu))  # <class 'json_test.student.Student'>
    stu = stu.__dict__  # 将对象转成dict字典
    print(type(stu))  # <class 'dict'>
    print(stu)  # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}
    j = json.dumps(obj=stu)
    print(j)  # {"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}


if __name__ == '__main__':
    obj_to_json()

json数据转成dict字典

import json

def json_to_dict():
    j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'
    dict = json.loads(s=j)
    print(dict)  # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}


if __name__ == '__main__':
    json_to_dict()

json数据转成对象

import json

def json_to_obj():
    j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'
    dict = json.loads(s=j)
    stu = Student()
    stu.__dict__ = dict
    print('id: ' + stu.id + ' name: ' + stu.name + ' age: ' + str(stu.age) + ' sex: ' + str(
        stu.sex) + ' phone: ' + stu.phone + ' email: ' + stu.email)  # id: 007 name: 007 age: 28 sex: male phone: 13000000000 email: 123@qq.com


if __name__ == '__main__':
    json_to_obj()

json的load()与dump()方法的使用
dump()方法的使用

import json

def dict_to_json_write_file():
    dict = {}
    dict['name'] = 'many'
    dict['age'] = 10
    dict['sex'] = 'male'
    print(dict)  # {'name': 'many', 'age': 10, 'sex': 'male'}
    with open('1.json', 'w') as f:
        json.dump(dict, f)  # 会在目录下生成一个1.json的文件,文件内容是dict数据转成的json数据


if __name__ == '__main__':
    dict_to_json_write_file()

load()的使用
import json

def json_file_to_dict():
    with open('1.json', 'r') as f:
        dict = json.load(fp=f)
        print(dict)  # {'name': 'many', 'age': 10, 'sex': 'male'}


if __name__ == '__main__':
    json_file_to_dict()

 

0人点赞

 

spark mllib

 



作者:Helen_Cat
链接:https://www.jianshu.com/p/d28d33e52aaa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的YAML可以通过PyYAML库来实现。PyYAML提供了将YAML格式数据解析为Python对象和将Python对象换为YAML格式数据的方法。下面是一个简单的示例代码: ```python import yaml # 将YAML格式数据解析为Python对象 with open('example.yaml', 'r') as f: data = yaml.load(f, Loader=yaml.FullLoader) # 将Python对象换为YAML格式数据 with open('example.yaml', 'w') as f: yaml.dump(data, f) ``` 在这个示例中,我们使用了`yaml.load()`方法将YAML格式数据解析为Python对象,并使用了`yaml.dump()`方法将Python对象换为YAML格式数据。注意,在解析YAML格式数据时,我们传递了一个`Loader`参数,这是为了防止YAML中的一些安全漏洞而必须指定的。 ### 回答2: Python的yaml模块是一个处理YAML格式文件的库。YAML是一种人类友好的数据序列化格式,常用于配置文件、数据交换和简单的持久化存储。通过使用yaml模块,我们可以轻松地将YAML文件换为Python对象,并将Python对象序列化为YAML格式。 主要功能: 1. 解析YAMLyaml模块提供了`load()`函数,可以将YAML文件的内容解析为Python对象,例如字典、列表等。这使得我们可以轻松地读取和访问YAML文件中的数据。 2. 序列化为YAML:使用yaml模块的`dump()`函数,我们可以将Python对象序列化为YAML格式的字符串,并将其写入文件。这使得我们可以方便地将Python对象保存为YAML文件。 3. 支持自定义对象yaml模块可以序列化和反序列化用户自定义的对象。通过为对象定义`__repr__()`和`__init__()`方法,我们可以确保自定义对象能够正确地被序列化和反序列化。 4. 支持注释:yaml模块支持在YAML文件中添加注释。通过使用`#`字符,我们可以在YAML文件中添加注释,提高文件的可读性。 5. 支持引用:yaml模块支持引用其他部分的数据。通过使用`&`字符定义引用标记,并使用`*`字符引用该标记,我们可以在YAML文件中重复使用相同的值,提高文件的可重用性。 总之,Python的yaml模块为我们处理YAML文件提供了简单而强大的工具集。无论是解析YAML文件、序列化Python对象还是处理自定义对象yaml模块都能够轻松胜任,并且提供了丰富的功能来提高文件的可读性和可重用性。 ### 回答3: Python中的yaml模块是一个用于处理和解析YAML格式的库。YAMLYAML Ain't Markup Language)是一种人类可读的数据序列化格式,它与XML和JSON类似,但更加简洁和易于阅读。 使用Python的yaml模块,我们可以将Python数据结构(如列表、字典等)换为YAML格式的字符串,也可以将YAML格式的字符串解析为Python数据结构。这对于在不同的系统之间传递和存储数据非常有用,尤其是当数据需要保持其结构和层次关系时。 在Python中使用yaml模块非常简单。首先,我们需要导入yaml模块: ```python import yaml ``` 然后,我们可以使用load()函数将YAML格式的字符串解析为Python数据结构: ```python data = yaml.load(yaml_string) ``` 我们还可以使用dump()函数将Python数据结构换为YAML格式的字符串: ```python yaml_string = yaml.dump(data) ``` 此外,yaml模块还提供了其他功能,如将YAML格式的数据写入文件或从文件中读取YAML数据。我们可以使用load_file()函数从文件中读取YAML数据,使用dump()函数将YAML数据写入文件。 总之,Python的yaml模块是一个非常方便和强大的工具,用于处理和解析YAML格式的数据。它可以帮助我们在不同的系统和编程语言之间轻松地传递和存储数据,并确保数据的结构和层次关系保持完整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值