我对python和编码很新。 我正在为俄罗斯社交网络(vk.com)编写自己的聊天统计机器人。
我的问题是我可以将字典存储在文件中并使用它吗?
例如:
Userlist=open('userlist.txt', '+')
If lastmessage['uid'] not in Userlist.read():
Userlist.read()[lastmessage.'uid']=1
Userlist.close()
或者我是否必须使用像JSON这样的侧面模块?
谢谢
答案 0 :(得分:3)
(根据澄清评论修改答案:在我想检查的同时真实周期中,如果用户的id在'userlist'字典中(作为键),如果没有,则将其添加到此字典中然后我想用一个新的字典重写文件。一旦程序启动,在循环之前文件就会打开:
为了在磁盘上稳健地使用数据,就像它是一个字典一样,您应该考虑 dbm 模块之一,或者只使用SQLite3支持。
dbm文件只是一组密钥和值,存储有透明维护和使用的索引。一旦打开了dbm文件,就可以像使用任何其他Python字典一样使用它(使用字符串作为键)。在关闭文件之前,可以简单地刷新和写入任何更改。这很简单,虽然它没有提供锁定的特殊功能(或者在可能有多个进程同时写入文件的情况下管理一致性)等等。
另一方面,功能强大的SQLite子系统已经包含在Python标准库中多年,它允许您轻松地将一组本地文件视为SQL数据库管理系统...基于客户端/服务器的系统所需的所有功能(外键,数据类型和参照完整性约束管理,视图和触发器,索引等)。
在您的情况下,您可以只使用一个包含单个列的表。绑定到该数据库(通过其文件名)将允许您使用SELECT查询用户的名称,并使用INSERT添加用户的名称。随着应用程序的增长和更改,您可以添加其他列来跟踪创建帐户的时间以及最近使用或检查的时间(几个时间/日期戳列),您可以创建其他具有相关数据的表(使用JOIN选择) , 例如)。
(原始答案):
通常,将任何内部数据结构存储为文件或通过网络连接传输的处理称为“序列化”。加载或接收此类数据并将其内容实例化为新数据结构的补充过程(不出所料)称为“反序列化”。
所有编程语言都是如此。
有许多方法可以在Python中序列化和反序列化数据。特别是我们有本机(标准库)pickle模块,它生成文件(或字符串),它们仅用于运行Python的其他进程,或者我们可以使用JSON ... JavaScript对象符号已成为事实上的跨语言数据结构序列化标准。 (还有其他如YAML和XML ......但是JSON已经占据主导地位。)
关于使用JSON和Pickle的警告是JavaScript(以及许多其他编程和脚本语言,对于某些类型的“字典”(关联数组)键使用不同的语义而不是Python。特别是Python(以及Ruby和Lua)将诸如“1”(包含数字“one”的字符串)和1或1.0(数字值等于1)的键视为不同的键.JavaScript,Perl和其他一些将键视为“标量”值,其中像“1”这样的字符串和数字1将评估为相同的密钥。
还有一些其他细微差别会影响序列化的保真度。但这是最容易理解的。字符串作为键的字典很好......数字和字符串键的混合是使用JSON序列化/反序列化代替酸洗遇到的任何麻烦的最可能原因。