您的位置:首页 > 其它

第21天 常用模块二

2018-10-17 23:29 901 查看

介绍的模块

pickle
shelve
json
xml
configparser

 人生三问

序列化是什么
  序列化就是将内存中数据格式转换成中间对象,存储到硬盘上面或者是传输到网络上面。   反序列化就是将硬盘或者网络中传输的中间对象转换成内存中数据格式的过程。

为什么要有序列化
1. 为了持久化存储文件
  数据是为了使用的,当我们的电脑断电之后数据就丢失是一件让人无法忍受的事情,因此我们要存储文件,存储的
方式有两种,一种就是自己打开文件写入文件,一种就是使用模块给我们存储文件。 
2. 为了跨平台进行交互
  之前我们在写atm程序的时候,为了持久保存信息都是自己通过open打开文件,然后将我们自己的数据转换成字符串的形式
写入文件中,当我们需要的时候重新按照一定的格式翻译成我们想要的样子展现给我们。这样做不仅麻烦,而且跨平台性很差,因为
无论我们把数据传给谁,我们都要告诉对方我这个数据是怎么存储的,你要怎么去获取,可能对方就算是获取了你的数据,也不一定
用它的语言去得到想要的值,或者说需要花费很长的时间去解析你的数据才能真正得到想要的数据。
  为了解决这样的问题,有了序列化。
  一天,有一个人告诉大家,以后你们都不要随便的存储数据了,都按照我的格式来存储,也都按照我的格式来解析好了,因此
网络上就出现了各式各样的序列化操作方法。归根结底就是一种通用的标准来来存储数据,方便其他人进行解析的。
怎么使用序列化
  序列化的方法有很多种,python中自带的有pickle, shelve模块,通用的模块有xml和json。接下来我来详细的
介绍一下怎么使用这几个模块。

模块一:pickel

方法1: dumps和loads

import pickle
user = {
'name': 'alex',
'sex': 'male',
'age': 32
}

# 序列化  将内存中的格式转换成字节流之后存储到文件中
with open('a.kle','wb') as f:
f.write(pickle.dumps(user))

# 反序列化 将文件中的字节流读取到内存转换成想要的格式
with open('a.kle', 'rb') as f:
res = pickle.loads(f.read())
print(res)

方法2: dump和load

# dump和load封装了文件的write和read方法
# 使得模块使用起来更加的方便
# 序列化
with open('a', 'wb') as f:
pickle.dump(user, f)
# 反序列化
with open('a', 'rb') as f:
print(pickle.load(f))

模块二:shevel

import shelve
# shelve只有一个open函数
# 打开文件,文件可以存在也可以不存在,
f = shelve.open(r'shelve.txt', writeback=True)
# 在关闭之前可读可写参数writeback=True代表的是否可以进行修改
# f['user'] = {'name': 'hu'}
print(f['user'])
f['user']['sex'] = 'male'
f.close()

 

通用的模块

模块三:json

json是什么?
json是一种轻量级的数据交换语言。简单清晰的层次结构使得它更易于人们的阅读以及机器的解析。能够有效的提高网络传输速率。
'''
js中的数据类型和python中数据类型的一一转换关系

js中的数据类型                python中的数据类型
{}                            dict
[]                            list
int/float                     int/float
string""双引号                str
true/false                    True/False
null                          None

json格式的语法规范:
最外层通常是一个字典或者列表
字符串要用双引号
你可以在里面套用任意多的层次
'''

方法一:dumps, loads

# 和pickle的使用方法是一样的,如果是dumps和loads要通过f.write和f.readfang方法辅助
import json user = { 'name': 'hu', 'sex': 'male', 'age': 123 } # 序列化 with open('a.json', 'wt', encoding='utf-8') as f: f.write(json.dumps(user)) # 反序列化 with open('a.json', 'rt', encoding='utf-8') as f: print(json.loads(f.read()))

方法二:dump, load

with open('a.json', 'wt', encoding='utf-8') as f:
json.dump(user, f)

with open('a.json', 'rt', encoding='utf-8') as f:
print(json.load(f))

模块四:xml

xml是什么
xml是一种可扩展的标记语言,它制定了一种文本内容的书写规范,使得计算机能够很轻松的识别这些数据。用于多个平台之间
的数据交换。和json类似。 xml语法标准
  1. xml的每一个标签必须有一个结束标签
  2. 标签可以嵌套使用
  3. 所有的属性必须有值
  4. 所有的值必须是加上双引号
  5. 一个标签中可以同时表示起始和结束标签 eg:<百度百科词条/>
eg:标签是由
  <a>
    <b name="hu">
    <b/>
  <a/>

 

'''
xml.etree.ElementTree as ET
tree = ET.parse('b.xml')
root = tree.getroot()
tree的方法:
步骤一:获得根标签
parse     解析一个xml文档获得一个对象
getroot   根据获得得对象获得当前xml文档的跟标签
步骤二:根据根标签找子标签
iter      全xml文档去寻找标签
find      找到当前层的一个标签
findall   找到当前层的所有标签
getchildren   获得当前标签的儿子标签
步骤三:找到子标签更改标签的内容:
text       标签文本,必须是叶子节点
attrib     属性值
set()      设置属性
步骤四:删除该标签
remove     删除当前节点
步骤五:添加标签
创建节点:
year2 = ET.Element('year2')
# 设置节点的text
year2.text = '新年'
# 设置节点的属性
year2.attrib = {'updated': 'yes'}

步骤六:一系列操作完成之后写入文件:
tree.write()
ET.dump()  把xml对象转换成一个文本
'''

 

案例:

# 注释1
; 注释2

[section1]
k1 = v1
k2:v2
user=egon
age=18
is_admin=true
salary=31

[section2]
k1 = v1
conf.cfg

查看方法

# config = configparser.ConfigParser().read('conf.cfg', encoding='utf-8')

config = configparser.ConfigParser()
config.read('conf.cfg', encoding='utf-8')

# 查
print(config.sections())
print(config.items('section1'))
print(config.options('section1'))
print(config.get('section1', 'k1'))
print(config.getint('section1', 'age'))
print(config.getfloat('section1', 'age'))
# print(config.getboolean('section1', 'is_admin'))

# 改
# config.remove_section('section2')  # 删除的是整个分区
config.remove_option('section2', 'k1')
print(config.has_section('section2'))
print(config.has_option('section2', 'sje'))
# config.add_section('egon')
config.set('egon','name', 'egon')
config.set('egon', 'age', '18')
config.write(open('conf.cfg', 'w'))

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: