2013-07-22 24 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のサポート直列化の外のツールからの支援、パースと検証で、標準フォーマットであるという利点があります。ただも往復することができます、タプルと整数を示していますのために。 jsonライブラリも、ast.literal_eval()関数よりもはるかに高速です。

+1

ドキュメントへのリンク、+1ありがとう! –

14

ちょうどあなたがrepr()を使用して文字列に変換することができますast.literal_eval

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

を使用しています。

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

ダング私は遅くなっていた! – Serial

0

これらはちょうど2つのタプルであれば、あなたは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)] 
関連する問題