python学习day16 模块

Posted afly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习day16 模块相关的知识,希望对你有一定的参考价值。

‘‘‘
模块:包含了python定义和声明的文件,一个py文件就是一个模块
1,内置模块 python解释器自带的模块
2,扩展模块 前辈大牛编写的模块,需要下载使用
3,自定义模块 自己写的模块
*****序列化模块   json   pickle   shelve
json可用于不同语言的数据类型序列化为字符串,支持str,list,dict,bool这些数据类型
pickle只可用于python语言,支持所有python数据类型序列化为字符串,我们可以把对象也当做数据类型是所属类的数据类型
shelve也只可用于python,类似字典的操作,可将数据类型作为字典的键保存到文件中
‘‘‘

# json  dumps()/loads()    dump()/load()
# dumps(数据类型如字典)/loads(序列化的字符串)   dump(数据类型,文件句柄)/load(文件句柄)
import json
dic = {"name":"alex","age":18}
ret = json.dumps(dic,ensure_ascii=False)   # 将字典转化为序列化的字符串,增加ensure_ascii参数可以使字符串中的中文显示
dic2 = json.loads(ret)  # 将序列化的字符串转化回原数据类型


import json
dic = {"name":"alex","age":18}
with open("json_file",encoding=utf-8,mode=w) as f1:
    json.dump(dic,f1)     # 将字典转化为序列化的字符串并保存在文件中
with open("json_file",encoding=utf-8) as f2:
    print(json.load(f2))    # 将序列化的字符串转化回原数据类型
# 注意json.dump/load 只能对一个数据进行读取操作,如果有多个字典是不能都写进文件中的,不过我们可以通过其他手段实现
# 多个数据保存到一个文件


import json
dic1 = {"name":"alex1","age":18}
dic2 = {"name":"alex2","age":18}
dic3 = {"name":"alex3","age":18}
with open("json_files",encoding=utf-8,mode=w) as f1:
    s1 = json.dumps(dic1)
    s2 = json.dumps(dic2)
    s3 = json.dumps(dic3)   # 先使用dumps()将字典序列化为字符串
    f1.write(s1+
+s2+
+s3+
)   # 换行保存字符串
with open("json_files",encoding=utf-8) as f2:
    while True:
        try:
            for line in f2:
                print(json.loads(line))   # 这里不必处理strip ‘
‘, loads会自动忽略
        except EOFError:    # 当把文件中的序列化字符串读完后会抛出EOFError错误,这里我们使用 try ...except...处理异常
            break           # 遇到即 break ,怎么知道我们会遇到什么错误呢,一个个都记住是不大可能的,可以特意产生这个错误,
                            # 然后找到python解释器报错的语句就可以了
            
# {‘name‘: ‘alex1‘, ‘age‘: 18}
# {‘name‘: ‘alex2‘, ‘age‘: 18}
# {‘name‘: ‘alex3‘, ‘age‘: 18}

# pickle的用法和json基本一样,也是dumps(数据类型)/loads(序列化的字符串)   dump(数据类型,文件句柄)/load(文件句柄)
# 有一点不同的是pickle的dump()/load()可以读取多个序列化字符串
import pickle
dic1 = {"name":"alex1","age":18}
dic2 = {"name":"alex2","age":18}
dic3 = {"name":"alex3","age":18}
with open("pickle_files",mode=wb) as f1: # pickle 无论是dumps还是dump序列化的字符串都是bytes类型的,读写文件只能使用 wb,rb模式,且不能有编码模式
    pickle.dump(dic1,f1)
    pickle.dump(dic2,f1)
    pickle.dump(dic3,f1)
with open("pickle_files",mode=rb) as f2:
    while True:
        try:
            print(pickle.load(f2))      # 直接读就好了,它会自动一个一个读
        except EOFError:
            break

# 使用pickle保存类的对象
# 1,首先在文件中写入对象
import pickle
class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def work(self):
        print(%s正在敲代码% self.name)
a1 = A(alex,18)
a2 = A(sylar,20)
with open(pickle_obj,mode=wb) as f1:
    pickle.dump(a1,f1)
    pickle.dump(a2,f1)
# 现在我们的文件pick_obj已经保存了A的对象a1,a2,但是因为是我们自己定义的类,对象不能脱离类的定义单独存在,
# 所以下面使用文件中的对象有两种方法,一种是在当前文件中保留类 A 的定义,一种是把类 A 的定义放到其他py文件中,
# 通过引用该py文件作为模块,这样就有类的定义了

# ***对象的使用,方法一
import pickle
class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def work(self):
        print(%s正在敲代码% self.name)

li = []
with open(pickle_obj,mode=rb) as f2:
    while True:
        try:
            li.append(pickle.load(f2))
        except EOFError:
            break
for i in li:
    print(i.name,i.age)
# alex 18
# sylar 20

# ***对象的使用,方法二
import pickle
from guo123 import A        # 把类A 的定义放到guo123.py文件中
li = []
with open(pickle_obj,mode=rb) as f2:
    while True:
        try:
            li.append(pickle.load(f2))
        except EOFError:
            break
for i in li:
    print(i.name,i.age)
# alex 18
# sylar 20

#  ***shelve***
# shelve给我们提供一个open方法,是用key来访问的,使用起来和字典类似
import shelve
dic = {int:10, float:9.5, string:Sample data}
f = shelve.open(shelve_file)
f[key1] = dic
f.close()

import shelve
f1 = shelve.open(shelve_file)
get_dic = f1[key1]
print(get_dic)
# {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘}

# 这时默认是不可以对我们取出来的键值对进行修改或者新增的,如果我们想要
# 修改或者新增的话需要加一个参数  writeback=True
f2 = shelve.open(shelve_file,writeback=True)
print(f2[key1])   # {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘}
f2[key1][new_value] = this was not here before
print(f2[key1])   # {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘, ‘new_value‘: ‘this was not here before‘}

f2.close()

 

以上是关于python学习day16 模块的主要内容,如果未能解决你的问题,请参考以下文章

Python基础day-16[模块与包]

Python 之路 Day5 - 常用模块学习

python 学习_day28_常用模块补充

python学习day16

Python 之路 Day5 - 常用模块学习

Python全栈开发,Day6 - 模块学习