Ответ 1
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)
У меня есть виртуальная машина, которая читает инструкции из кортежей, вложенных в список, например:
[(0,4738),(0,36),
(0,6376),(0,0)]
При хранении такой программы машинного кода текстовый файл проще всего и должен быть записан как строка. Который, очевидно, довольно сложно преобразовать обратно.
Есть ли какой-либо модуль, который может читать строку в списке/хранить список в читаемом виде?
:
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)
Используйте 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 поддерживают сериализацию, разбор и проверку.
Просто используйте ast.literal_eval
>>> from ast import literal_eval
>>> a = literal_eval('[(1, 2)]')
>>> a
[(1, 2)]
Вы можете преобразовать его в строку с помощью repr()
.
>>> repr(a)
'[(1, 2)]'
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)]
Если это всего лишь две кортежи, вы можете сохранить их в CVS файле, используя csv
module. Нет необходимости в каких-либо скобках/скобках.
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]
Если вы просто используете примитивные типы 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.