python第10天对象持久化及字符编码

一、扁平文件
#以文本文件存储持久化对象
sorces=[88,99,77,55]
def write_sorces():
    with open('data_list.txt','w',encoding='utf8') as f:
        f.write(str(sorces))
    print('文件写入完成')#本质是文本文件,与列表无关
#如果想要读取到程序里面来,并且还原类型
def read_scores():
    with open('data_list.txt', 'r', encoding='utf8') as f:
        lst=eval(f.read())#eval能将括号里传递的字符串转换成python的表达式
    lst[0]=99
    print(lst)
if __name__=='__main__':
    write_sorces()
    read_scores()
二、pickle的应用,更方便
import pickle
person={'name':'Tom','age':20}
s=pickle.dumps(person)#dumps是将括号里面传递过来的对象,不管什么类型,这里把字典表类型序列化成一个字符串
print(s)
#还原
p=pickle.loads(s)#从字符串反序列化载入为原来的类型
print(p)
#序列化保存为一个文件s'用dump,没有‘s'
pickle.dump(person,open('pickle_db','wb'))#wb以二进制形式写入文件
p=pickle.load(open('pickle_db','rb'))
print(p)
#pickle的缺陷,在反序列化时,是将整个文件反序列化,所以如果是多个对象时,想要剥离某个对象时比较麻烦
三、shelve应用
#shelve可以将多个对象存贮在一个文件里面,主要形式通过键值来访问
import shelve
scores=[99,88,77]
student={'name':'mike','age':20}
db=shelve.open('shelve_student')
db['s']=student
db['score']=sorces
print(len(db))
temp_student=db['s']
print(temp_student)
del db['s']#若想要删除一个,可以使用全局的函数del
print(len(db))
#序列化自定义类的实例
import shelve
class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return  self.name
def write_shelve():
    s = Student('Tom', 20)
    db=shelve.open('shelve_student_db')
    db['s']=s
    db.close()
def read_shelev():
    db=shelve.open('shelve_student_db')
    st=db['s']
    print(st)
    print(st.age)
if __name__=='__main__':
    write_shelve()
    read_shelev()
四、字符的编码解码
# encode是编码
s='ABCD'
s.encode('ASCII')
print(s)
s1='学习'
print(s1.encode('utf-8'))
print(s1.encode('utf-8'))
print(s1)
#decode把乱码解码
b=b'\xe5\xad\xa6\xe4\xb9\xa0'
print(b.decode('utf8'))
#在写入文件中是以gbk的形式,所以必要时要进行编码,不然文件出现乱码
open('data.txt','w',encoding='utf8').write('学编程 xuebiancheng.com')
r=open('data.txt','r',encoding='utf8').read()
open('data.txt','w').write('大学')
r2=open('data.txt','r',encoding='gbk').read()
print(r)
print(r2)
#BOM处理,字节顺序标记,用utf-8-sig进行忽略
bom=open('data.txt','r',encoding='utf-8-sig').read()
print(bom)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值