Преобразование списка в строку и обратно

У меня есть виртуальная машина, которая читает инструкции из кортежей, вложенных в список, например:

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

При хранении такой программы машинного кода текстовый файл проще всего и должен быть записан как строка. Который, очевидно, довольно сложно преобразовать обратно.

Есть ли какой-либо модуль, который может читать строку в списке/хранить список в читаемом виде?

:

  • Должен быть человеком, читаемым в сохраненной форме (следовательно, "рассол" не подходит)
  • Должно быть относительно легко реализовать

Ответ 1

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)

Ответ 2

Используйте 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() и 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 поддерживают сериализацию, разбор и проверку.

Ответ 3

Просто используйте ast.literal_eval

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

Вы можете преобразовать его в строку с помощью repr().

>>> repr(a)
'[(1, 2)]'

Ответ 4

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)]

Ответ 5

Если это всего лишь две кортежи, вы можете сохранить их в CVS файле, используя csv module. Нет необходимости в каких-либо скобках/скобках.

Ответ 6

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]

Ответ 7

Если вы просто используете примитивные типы 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.