2016-02-27 143 views
-1

我对python和一般编码颇为陌生。 我正在为俄罗斯社交网络(vk.com)编写我自己的聊天统计信息机器人。如何在文件中存储字典?

我的问题是我可以在文件中存储字典并使用它?

例如:

Userlist=open('userlist.txt', '+') 
If lastmessage['uid'] not in Userlist.read(): 
    Userlist.read()[lastmessage.'uid']=1 
Userlist.close() 

还是我不得不用这样的JSON一些端模块?

谢谢

+0

所以,你正在寻找一个文件中存储的字典,然后再读回到你的代码以后使用? – idjaw

+0

使用'json'非常简单。 'obj = json.load(f)'读取,'json.dump(obj,f)'保存 –

+2

你可以'pickle'任何python结构。 – roadrunner66

回答

3

(Ammended答案澄清评论的光:的同时实现真正的周期我要检查,如果用户的ID是“用户列表”字典(如钥匙),如果没有,添加然后我想用一个新的字典重写文件,在程序启动后立即打开文件,在周期前):

为了在磁盘上稳健地使用数据它是一本字典,您应该考虑dbm模块或仅使用SQLite3支持。

A dbm文件只是一组键和值,透明地维护和使用索引。一旦你打开了你的dbm文件,你就可以像使用任何其他Python字典一样使用它(用字符串作为键)。在关闭文件之前,可以简单地刷新和写入任何更改。这很简单,虽然它没有提供锁定的特殊功能(或者在可能有多个进程同时写入文件的情况下管理一致性)等等。

另一方面,多年来一直包含在Python标准库中的令人难以置信的强大的SQLite子系统允许您轻松将一组本地文件当作SQL数据库管理系统来处理......所有基于客户机/服务器的系统(外键,数据类型和参照完整性约束管理,视图和触发器,索引等)所期望的功能。

在你的情况下,你可以只有一个包含单个列的表。绑定到该数据库(通过其文件名)将允许您使用SELECT查询用户的名称,并使用INSERT添加该用户的名称。随着应用程序的增长和更改,您可以添加其他列以跟踪帐户何时创建以及何时最近使用或检查(多个时间/日期戳记列),并且可以使用相关数据创建其他表(使用JOIN , 例如)。

(原来的答复):

通常存储任何内部数据结构作为一个文件,或通过网络连接发送它的处理中,被称为“序列”。加载或接收这种数据并将其内容实例化为新的数据结构的补充过程被称为(“不出所料”)“反序列化”。

所有编程语言都是如此。

有很多方法可以在Python中序列化和反序列化数据。特别是我们有本地(标准库)pickle模块,它生成的文件(或字符串)只能用于运行Python的其他进程或与其他进程一起使用,或者我们可以使用JSON ...已成为JavaScript对象表示法事实上的跨语言数据结构序列化标准。 (还有其他的如YAML和XML ......但JSON已经占据主导地位)。

关于使用JSON和Pickle的警告是JavaScript(和许多其他编程和脚本语言对Python的某些“字典”(关联数组)键使用不同的语义,特别是Python(和Ruby和Lua)将诸如“1”(包含数字“1”的字符串)和1或1.0(数字值等于1)的键作为不同的键处理。JavaScript,Perl和一些其他人将键视为“标量”值这些字符串像“1”和数字1将评估到相同的密钥

还有一些细微差别可以影响你的序列化的保真度,但这是最容易理解的字符串作为键的字典都很好数字和字符串键的混合是最可能的原因使用JSON序列化/反序列化代替酸洗会遇到麻烦。

+0

非常感谢。 只要这是用户列表,键将是字符串。 – Warpony

+0

尽管我没有明确提到它,但我想指出,使用dbm或SQLite文件将允许您有效地使用远大于可用内存的数据集。正如我所说的,dbm文件自动编入索引,您可以在SQLite数据上创建索引,然后以完全透明的方式进行维护......只要您的代码添加,删除或修改数据,就会被库隐式地保存。 –

+0

伟大的答案@JimDennis。很彻底。 – idjaw