26

我有一个虚拟机,它从嵌套在列表中的元组中读取指令,如下所示:

[(0,4738),(0,36),
 (0,6376),(0,0)]

在存储这种机器代码程序时,文本文件是最简单的,必须写成字符串。这显然很难转换回来。

是否有任何模块可以将字符串读入列表/以可读方式存储列表?

要求:

  • 必须以存储形式可读(因此“泡菜”不适合)
  • 必须相对容易实施
4

7 回答 7

41

使用json模块

string = json.dumps(lst)
lst = json.loads(string)

演示:

>>> import json
>>> lst = [(0,4738),(0,36),
...  (0,6376),(0,0)]
>>> string = json.dumps(lst)
>>> string
'[[0, 4738], [0, 36], [0, 6376], [0, 0]]'
>>> lst = json.loads(string)
>>> lst
[[0, 4738], [0, 36], [0, 6376], [0, 0]]

另一种方法是使用repr()and ast.literal_eval(); 仅适用于列表、元组和整数,它们还允许您往返:

>>> from ast import literal_eval
>>> string = repr(lst)
>>> string
'[[0, 4738], [0, 36], [0, 6376], [0, 0]]'
>>> lst = literal_eval(string)
>>> lst
[[0, 4738], [0, 36], [0, 6376], [0, 0]]

JSON 还有一个额外的优势,它是一种标准格式,Python 之外的工具支持序列化、解析和验证。该json库也比ast.literal_eval()函数快得多。

于 2013-07-22T20:08:07.640 回答
26

只需使用ast.literal_eval

>>> from ast import literal_eval
>>> a = literal_eval('[(1, 2)]')
>>> a
[(1, 2)]

您可以使用 将其转换为字符串repr()

>>> repr(a)
'[(1, 2)]'
于 2013-07-22T20:08:17.607 回答
21

JSON!

import json

with open(data_file, 'wb') as dump:
    dump.write(json.dumps(arbitrary_data))

同样:

source = open(data_file, 'rb').read()
data = json.loads(source)
于 2013-07-22T20:08:51.013 回答
16

eval应该以简单的方式做到这一点:

>>> str([(0,4738),(0,36),(0,6376),(0,0)])
'[(0, 4738), (0, 36), (0, 6376), (0, 0)]'

>>> eval(str([(0,4738),(0,36),(0,6376),(0,0)]))
[(0, 4738), (0, 36), (0, 6376), (0, 0)]
于 2014-11-08T12:34:23.483 回答
1

如果你只是处理原始的 Python 类型,你可以使用内置的repr()

Help on built-in function repr in module __builtin__:

repr(...)
    repr(object) -> string

    Return the canonical string representation of the object.
    For most object types, eval(repr(object)) == object.
于 2013-07-22T21:10:34.457 回答
0

如果这些只是两个元组,您可以使用csvmodule将它们存储在 CVS 文件中。不需要任何括号/括号。

于 2013-07-22T20:09:22.093 回答
0
with open('path/to/file', 'w') as outfile:
     for tup in L:
         outfile.write("%s\n" %' '.join(str(i) for i in tup))

with open('path/to/file) as infile:
    L = [tuple(int(i) for i in line.strip().split()) for line in infile]
于 2013-07-22T20:12:44.520 回答