2025年nonetype对象没有属性mode(python对象没有这个属性)

nonetype对象没有属性mode(python对象没有这个属性)进入正题 开始学习模块 Py 模块本质来讲它就是 py 文件 python 之所以好用 有一个很重要的原因是它提供的模块多 其中模块大致分为三种 1 内置模块 python 安装的时候自带的 2 扩展模块 例 itchat 微信 beautiful soap 爬虫模块 selenium 网页自动化测试工具 diango tornado 框架 别人写好的 一堆模块

大家好,我是讯享网,很高兴认识大家。



进入正题:开始学习模块
Py模块本质来讲它就是py文件。
python之所以好用,有一个很重要的原因是它提供的模块多。
其中模块大致分为三种:

1)内置模块

python安装的时候自带的。

2)扩展模块

例:itchat(微信)beautiful soap (爬虫模块)
selenium (网页自动化测试工具)
diango tornado(框架)
别人写好的(一堆模块),需要的时候安装上之后可以直接使用。
www.pypi.org网站就有提供模块下载。

3)自定义模块

自己写的模块之类

比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。
但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。
你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?
没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串,
但是你要怎么把一个字符串转换成字典呢?
聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
BUT!强大的函数有代价。安全性是其最大的缺点。
想象一下,如果我们从文件中读出的不是一个数据结构,而是一句”删除文件”类似的破坏性语句,那么后果实在不堪设设想。
而使用eval就要担这个风险。
所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

序列化的目的

1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

python 中的序列化模块有以下三种:

json 所有的编程语言都通用的序列化格式(使用广)但它支持的数据类型非常有限(支持窄)
支持的数据类型:数字,字符串,序列(列表,元祖),字典。
pickle 只能在python语言的程序之间传递数据用(使用窄)但pickle支持python中所有的数据类型(支持广)
shelve python3.x 之后才有。

JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式。
它基于ECMAScript的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯
(包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

json序列化模块

小结:

dump序列化,load反序列化:主要用于一个数据直接存在文本里—直接和文件打交道。


讯享网

json中不支持除了str数据类型之外的key,对元祖也不支持,会将元祖看成列表去操作。

小技巧:
如何让json显示得更好看(更像一个json)

关于序列化中多次读写的这种操作:

json在多次dump(不隔行写入多个元素)的时候,不能对应执行多次load来取出数据,而pickle可以。

json如果要写入多个元素,可以先将元素dumps序列化,f.write(序列化+’ ’)写入文件。

读出元素的时候,应该先按行读文件,在使用loads将读出来的字符串转换成对应的数据类型。

pickle强大之处还在于它支持python中的所有数据类型,比如一个对象:
一个对象序列化到文件中,把一个对象完完整整的放进到一个文件中。
(例如游戏里的存档和读档)

python序列化模块-shelve模块详解

shelve:vt. 将(书等)放置在架子上;搁置,将某事放到一旁不予考虑;将…搁在一边;装搁架于;

(特别是在已有json和pickle的情况下)
使用json或者pickle持久化数据,能dump多次,但load的话只能取到最新的dump,
因为先前的数据已经被后面dump的数据覆盖掉了。
如果想要实现dump多次不被覆盖,就可以想到使用shelve模块。
shelve模块可以持久化所有pickle所支持的数据类型。
另外,写程序的时候如果不想用关系数据库那么重量级的去存储数据,也可以用到shelve。
shelf也是用key来访问的,使用起来和字典类似。
注意的是,在shelve模块中,key必须为字符串,而值可以是python所支持的数据类型。
另外,shelve其实用anydbm去创建DB并且管理持久化对象的。

shelve.py中的open方法代码如下:

上面的说明我们主要要注重到 d[key] = data 和 data = d[key],这俩充分说明了shelve的一些机制。
首先,shelve做为一个类似数据库缓存的大字典,肯定得支持用户对它写入一些键,这个很好理解。
但是,如果你在shelve db中己存在有一个key,你重新再写入与它同名的key的一些数据(data),
那新写入的这个覆盖掉旧的同样也是很好理解的。

那么不好理解的就是,为什么你对一个key里面的值去作出增加或删除其中一个元素的时候会修改不成功?
这里在data = d[key]里其实就给出了答案,这种属于对key的访问,返回的其实是条目(key)的一个拷贝!
所以才有了writeback这个默认参数的存在,让你可以自主选择要不要做出修改后,将拷贝写回!
这样就可以修改生效。

例:

所以我们一定要弄明白一件事情,
从shelve的db文件中重新再访问一个key拿的是它的拷贝!
修改此拷贝后不做拷贝写回并不影响原来的key,
但你要是直接做的操作是赋值新的值到一个key里,那肯定就是指向原来的key,会被覆盖的。
而这种赋值覆盖对于shelve来说这是一个正常的行为阿。
和键中的值看起来不能被修改一事并不矛盾。

writeback方式有优点也有缺点。

优点是减少了我们出错的概率,且让对象的持久化对用户更加的透明了;
但这种方式并不是所有的情况下都需要,
首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,
并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。
因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入。

应用场景例子:

模拟保存用户登录状态:
距离上一次登录不超过设置时间内的可以重新登录,
超过时间则无法再使用原用户密码登录。
又需要重新注册。

总之,大致上就是如此,shelve模块它可以当成一个轻量的数据库db来使用,
比起刚学python的时候使用文件来说,还是比较显得有趣和高大上一些的。
利用它的字典特性,也能玩转一下记录用户登录状态来完成一些例如再进其它页面,
再调用其它函数或方法就能正常调用不需重新认证等,简洁代码。
模拟感受一下有数据库存在的情景等还是比json和pickle有用的。

小结:
1、shelve模块将内存数据以字典的类型(key,value)通过文件持久化,模拟出简单的db效果。
2、shelve模块可以持久化任何pickle可支持的python数据格式,但是它的key必需得是字符串。
3、shelve可以看作是pickle模块的一个封装,但它实现了可以多次dump(后面的dump不会覆盖前面的)和多次load。
4、shelve访问己有key时,实际上取出的是数据源给出的一份拷贝,
所以对于拷贝做出的增加和删除等操作都需要用writeback=True参数才能实现写入回源中进行修改。
5、shelve对于d[key] = data这种操作,视为存储数据,无则新增,有则覆盖,
与访问key对当中的值(条目)进行修改默认不回写并不矛盾和冲突。
6、默认安装环境下,shelve中的r只读模式在python2.7能生效,在3.5环境中则不能生效。
有很大可能是与2.7中存在anydbm模块,而3.5中只存在dbm模块而不存在anydbm有关。

小讯
上一篇 2025-04-23 19:55
下一篇 2025-05-08 18:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/202875.html