3

我有一个 python dict,它的键和值是字符串、整数和其他字典和元组(json 不支持这些)。我想将它保存到一个文本文件中,然后从文件中读取它。 基本上,我想要一个read内置的对应物print(比如在 Lisp 中)。

约束:

  1. 该文件必须是人类可读的(因此泡菜出来了)
  2. 无需检测循环。

有什么比json更好的吗?

4

2 回答 2

9

您可以repr()在 上使用dict,然后将其读回并使用ast.literal_eval(). 它与 Python 本身一样具有人类可读性。

例子:

In [1]: import ast

In [2]: x = {}

In [3]: x['string key'] = 'string value'

In [4]: x[(42, 56)] = {'dict': 'value'}

In [5]: x[13] = ('tuple', 'value')

In [6]: repr(x)
Out[6]: "{(42, 56): {'dict': 'value'}, 'string key': 'string value', 13: ('tuple', 'value')}"

In [7]: with open('/tmp/test.py', 'w') as f: f.write(repr(x))

In [8]: with open('/tmp/test.py', 'r') as f: y = ast.literal_eval(f.read())

In [9]: y
Out[9]:
{13: ('tuple', 'value'),
 'string key': 'string value',
 (42, 56): {'dict': 'value'}}

In [10]: x == y
Out[10]: True

您也可以考虑使用该pprint模块进行更友好的格式化输出。

于 2015-01-20T21:41:16.410 回答
1

老实说,json 是你的答案[编辑:只要键是字符串,没有看到关于 dicts 作为键的部分],这就是为什么它在至少 5 年内被接管的原因。json 有哪些易读性问题?有大量的 json 缩进器、漂亮的打印机实用程序、浏览器插件 [1][2] - 使用它们,它当然是人类可读的。json(/simplejson) 也非常高效(C 实现),它可以扩展,并且可以串行处理,这对于 AST 方法是不能说的(为什么要古怪并破坏可扩展性?)。

这似乎也是 100% 的人在这里回答你的共识......每个人都不会错 ;-) XML 已经死了,很好摆脱。

  1. 我怎样才能漂亮地打印 JSON?和无数其他人
  2. 浏览器 JSON 插件
于 2015-01-20T22:17:26.693 回答