2013-07-22 109 views
13

我有一個虛擬機讀取從元組嵌套在一個列表中,像這樣的指令:轉換列表爲字符串,並回

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

當存儲這種機器代碼程序,文本文件是最簡單的,並且必須寫成一個字符串。這顯然很難轉換回來。

是否有任何模塊可以讀取字符串到列表中/以可讀的方式存儲列表?

要求:

  • 必須是人類可讀的存儲形式(因此 「鹹菜」 不適合)
  • 必須是相對容易實現

回答

11

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

使用json module

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()功能快得多。

+1

+1鏈接到文檔,謝謝! –

14

只需使用ast.literal_eval

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

你可以把它轉換成使用repr()的字符串。

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

當我要慢! – Serial

0

如果這些都只是兩元組,你可以將它們使用csv module存儲在一個CVS文件。不需要任何括號/括號。

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

如果你只是處理原始的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. 
5

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