python shelve模块来写回合游戏,python shelve模块报错non-inter

  python shelve模块来写回合游戏,python shelve模块报错non-inter

  引入数据持久化就是把数据从内存刷到磁盘。但是要保证在阅读的时候可以恢复到原来的状态。pickle、json等持久化模块基本不用介绍。这里是另外两个很少使用但功能强大的模块。Python的“DBM”在一些小程序中,不需要关系数据库的时候,使用持久性字典来存储键值对是很方便的,这和Python中的字典很像。此外,dbm的键和值必须是str或bytes类型导入dbm 。这里第一个参数直接传入文件名,第二个参数表示常用模式:R: readable,默认模式。W:可读可写,但是R和W,你必须确保文件已经存在,否则会报错。c:可读可写。当文件不存在时,将创建N:可读和可写的,但总是会创建一个新文件。也就是说,如果创建了一个同名的文件,那么之前的内容就会被清空,也就是说不会产生额外的效果。所以在我们通常的模式下,一般选择c,第三个参数是权限,windows下基本不用。是一组用八进制表示的数,默认为0o666,都是可读可写可执行的 db=dbm.open(store , c) #打开文件后,可以存储值#注意,key和值都必须是str或bytes类型DB[ name ]= satori DB[ age ]= 16 DB[ gender ]= f DB[ anime ]=东方地球之殿 #关闭文件, 将内容写入db . close()# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # b 年龄,b 性别,b 动漫]for key in db . keys():print(f key={ key },value={db[key]}) key=bname ,value=bsatori key=b 年龄,value=b16 key=b 性别,value=bf key=b 动漫,value=b \ xe4 \ xb8 \ x9c \ xe6 \ x96 \ xb9 \ xe5 \ x9c \ x9c

  会有三个额外的文件。

  ShelvePython Shelve类似于dbm,但它远比dbm强大,因为它可以持久化任何对象。 import shelve #参数标志默认为C,所以我们只需要传入文件名。这将自动追加到下面的#。也就是说,我写完之后,如果再打开继续写,只有append不会空sh=shelve . open( shelve )sh[ dict ]={ name : satori , age: 16} sh [list]=[1,2,3,4] sh [set]={1,刷入内存#关闭之后,就不能操作sh.close() #接下来,我们就可以操作数据了。下面的代码可以写在另一个py文件中。SH2=shelve . open( shelve )print(SH2 [dict],SH2[ dict ])。keys()) # {name: satori , age: 16} dict_keys([name , age]) print(sh2[list],sum(sh2[ list ])#[1,2,3,4] 10print (sh2 [set]) # {1,2,3} sh2.close () #可以看到,拿出来的是原生对象,可以直接用于操作。让我们看看是否可以定义我们自己的类。sh3=shelve . open( shelve )class A:def _ _ init _ _(self,name,age):self . name=name self . age=age @ property def print _ info(self):return f 我的名字是{self.name},年龄是{self.age} a=A(satori , 16) #将这个类和该类的一个实例对象存储在sh3[ a ]=ash3[ a ]=ash3 . close()# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #传入参数,调用方法print (sh4 [a] (mashiro , 17 )。 print _ info) # mynameis mashiro,ageis17 # sh4 [a]要获取实例对象A,调用方法print (sh4 [a]。print _ info) # mynameissatori,年龄16 #直接。我们发现还是有可能的,它说明shelve是一个真正强大的模块python #我们再来看另一个例子import shelve sh=shelve . open( shelve )sh[ list ]=[1,2,3]sh[ str ]= mashiro sh . close()# # # # # # # # # # # # # # # # # # # # # # # sh=shelve . open( shelve )sh[ list ]。append( xxxx )sh[ str ]= satori sh . close()# # # # # # # # # # # # # # sh=shelf . open( shelf )print(sh[ list ])#[1,2,3] print(第一次打开文件时,我们创建了两个键值对sh [list]=[1,2,3] sh [str]= mashiro 。第二次打开文件时,我们修改了两个键的值。第三次我们打开文件打印出来。但是我们发现sh[str]变了,而sh[list]没有变。为什么?首先,sh[str]=satori 很好理解,但是为什么sh[list]没有变?因为=,我们是直接赋值来替换这个内存块中的值,而sh[list]我们做的是append操作,只是修改原来的那个。默认情况下,shelve不会记录和保存对象的修改,除非您创建一个新对象或替换原来的对象。如果是基于原(可变类型)的,比如list和dictionary,添加或者删除操作,这些都不会被记录,所以:sh [list]=[1,2,3] sh [list]。append (xxxx)-sh [list],仍然是[1,2,3],不会是[1,2,3,,一种方法是用sh[list]=[1,2,3, xxxx],相当于重新赋值,可行。

  但是有时候我们不知道列表的内容,或者列表的内容是不是一些函数,类等等。哪些很难写,我们该怎么办?其实我们在打开文件的时候还可以添加一个名为write back python import shelve sh=shelve.open (shelve )sh[ list ]=[1,2,3]sh[ str ]= ma Shiro sh . close()# # # # # # # # # # # # # # # # # # # # # # # #如果我们需要做修改的话只需添加一个writeback=True就可以了,从名字就可以看出,#这是将修改后的内容重写回sh=shelve . open( shelve ,writeback=True) sh[listappend( xxxx )sh[ str ]= satori sh . close()# # # # # # # # # # # # # # # # # # # sh=shelve . open( shelve )print(sh[ list ])#[1,2,3, xxxx] print (sh [str]) # satori 可以看出全部都变了,但是这个参数有缺陷,就是会有额外的内存消耗。当我们添加writeback=True时,shelve会将我们读取的所有对象放入内存缓存中。举个例子,我们得到20个持久化对象,但是我们只修改了一个,剩下的19个只是查看而没有修改。但是当我们sh.close()的时候,我们会把这20个对象全部写回去。shelve不知道你会修改哪个对象,所以不管你是查看还是修改,都会放入缓存,然后一次性写回。这会造成两件事:1。对象放在内存缓存中,相当于复制了另一个副本,因为我们读取的文件已经在内存中了,shelve把我们使用的对象放在内存中的另一个空间。2.写数据时,我们明明只修改了数据的一个副本,它却把20个副本都重写了,这样会造成性能问题,降低效率。所以这个参数加不加,要看具体情况。还会有三个以上的文件。

  转载于:https://www。cnblogs。com/valor Chang/p/11395406。超文本标记语言

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: