• json & pickle 序列化


     1 #!/usr/bin/python
     2 # -*- coding: utf-8 -*-
     3 
     4 # 序列化: 例如把字典写进文件
     5 info = {
     6     'name': 'alex',
     7     'age': 22
     8 }
     9 
    10 f = open('test.text', 'w')
    11 f.write(str(info))  # 把字典作为字符串写进文件
    12 f.close()
    13 
    14 
    15 # 反序列化: 接上例, 把文件中的字符串读取并转换成字典
    16 f = open('test.text', 'r')
    17 data = eval(f.read())
    18 f.close()
    19 print(data['age'])
    20 
    21 
    22 # 用json来完成序列化
    23 import json
    24 info = {
    25     'name': 'alex',
    26     'age': 22
    27 }
    28 
    29 f = open('test.text', 'w')
    30 print(json.dumps(info))
    31 f.write(json.dumps(info))  # 序列化
    32 f.close()
    33 
    34 
    35 # 用json来完成反序列化
    36 f = open('test.text', 'r')
    37 data = json.loads(f.read())  # 反序列化
    38 print(data['age'])
    39 
    40 
    41 # 序列化更复杂的应用, 不支持. json只能进行简单数据的序列化. json主要支持不同语言之间进行数据交互,所以太复杂的做不了. xml在逐渐被json取代.
    42 def sayhi(name):
    43     print('hello', name)
    44 
    45 info = {
    46     'name': 'alex',
    47     'age': 22,
    48     'func': sayhi
    49 }
    50 
    51 f = open('test.text', 'w')
    52 f.write(json.dumps(info))  # 失败. json不能处理这种复杂的信息.
    53 f.close()
    54 
    55 
    56 # 若需要处理更复杂的数据, 用pickle. pickle只有在Python里能用, 其它语言不行.
    57 # 序列化.
    58 import pickle
    59 def sayhi(name):
    60     print('hello', name)
    61 
    62 f = open('test.text', 'wb')
    63 
    64 info = {
    65     'name': 'alex',
    66     'age': 22,
    67     'func': sayhi
    68 }
    69 
    70 f.write(pickle.dumps(info))  # pickle会默认转换成二进制,所以读取方式应该是wb而不是w.
    71 f.close()
    72 
    73 
    74 # 反序列化
    75 import pickle
    76 def sayhi(name):
    77     print('hello2', name)  # 反序列化一个不同的函数(名字一样, 方法体不一样),也可以. ? 如果没有序列化过, 为佳么可以反序列化?
    78 
    79 f = open('test.text', 'rb')
    80 
    81 
    82 data = pickle.loads(f.read())  # 反序列化. 这样会出错, 因为函数sayhi用完就释放了, 内存地址就不存在了. 所以这
    83 print(data['func']('Alex'))
     1 # 序列化.
     2 import pickle
     3 def sayhi(name):
     4     print('hello', name)
     5 
     6 info = {
     7     'name': 'alex',
     8     'age': 22,
     9     'func': sayhi
    10 }
    11 
    12 f = open('test.text', 'wb')
    13 
    14 pickle.dump(info, f)  # 等同于 f.write(pickle.dumps(info))
    15 f.close()
    16 
    17 
    18 # 反序列化
    19 import pickle
    20 def sayhi(name):
    21     print('hello2', name)  # 反序列化一个不同的函数(名字一样, 方法体不一样),也可以. ? 如果没有序列化过, 为佳么可以反序列化?
    22 
    23 f = open('test.text', 'rb')
    24 
    25 
    26 data = pickle.load(f)  # 等同于 data = pickle.loads(f.read())
    27 print(data['func']('Alex'))
     1 # 序列化. dumps两次, loads的时候会出错 . 所以最好只dumps 一次, load 一次. 
     2 import json
     3 
     4 info = {
     5     'name': 'alex',
     6     'age': 22
     7 }
     8 
     9 f = open('test.text', 'w')
    10 
    11 f.write(json.dump(info, f))  # 等同于 f.write(pickle.dumps(info))
    12 
    13 
    14 info['age'] = 21
    15 f.write(json.dumps(info))  # 这样会存两个字典进去. 两个字典的age值不同.
    16 
    17 
    18 f.close()
    19 
    20 
    21 # 反序列化
    22 import json
    23 
    24 f = open('test.text', 'r')
    25 data = json.loads(f)
    26 
    27 print(data)
  • 相关阅读:
    LeetCode 139. Word Break
    Amazon behavior question
    学习笔记之100 TOP Ikm C++ Online Test Questions
    学习笔记之IKM C++ 11
    学习笔记之C/C++指针使用常见的坑
    LeetCode 208. Implement Trie (Prefix Tree)
    队列 & 栈//岛屿的个数
    队列 & 栈//设计循环队列
    队列 & 栈//设计循环队列
    查找表类算法//存在重复元素 III
  • 原文地址:https://www.cnblogs.com/cheese320/p/8980846.html
Copyright © 2020-2023  润新知