2009-10-03 69 views
2

有沒有辦法將python數據結構以文本形式寫入文件。Python:如何以文本形式將數據結構寫入文件(不醃製)

例如一個應用程序正在運行,並且具有可變的/對象:OPTIONS =(「ON」,「OFF」,)

我需要寫/合併OPTIONS元組到另一個文件,而不是一個 酸洗對象,但作爲文本,逐字:OPTIONS =('ON','OFF',)

我可以遍歷元組,並逐個將元素寫入目標文件 ,但想知道是否有更簡單的方法。

注:如果我做了一個 「直」 的寫,我得到如下:

fout.write(OPTIONS) 
... 
TypeError: argument 1 must be string or read-only character buffer, not tuple 

回答

4

你可以使用repr(再版與具有__repr__()方法的東西效果很好):

>>> OPTIONS=('ON', 'OFF',) 
>>> "OPTIONS="+repr(OPTIONS) 
"OPTIONS=('ON', 'OFF')" 
+1

而且ast.literal_eval可以將文本解析回Python數據結構是有用的。 – FogleBird 2009-10-03 00:51:45

+0

我會使用execfile。 http://docs.python.org/library/functions.html#execfile – 2009-10-03 01:25:51

1

fout.write(str(OPTIONS))做你想在這種情況下,但毫無疑問,在許多其他人不會; repr而不是str可能更接近你的願望(但是,它可能不是,因爲你表達他們如此模糊和一般,超出這個單一的例子)。

1

我不知道你的範圍,但你可以使用另一種序列化/持久性系統,如JSONTwisted Jelly,這些系統更具人類可讀性(還有其他類似YAML)。

我在某些項目中使用了果凍來設置首選項文件。它非常易於使用,但必須使用repr()將數據保存爲可讀形式,然後使用eval()將其讀回。所以不要這樣做,因爲使用eval()會帶來安全風險。

下面是美化表示(添加縮進)一個代碼示例:

VERSION = 'v1.1' 

def read_data(filename): 
    return unjelly(eval(open(filename, 'r').read().replace('\n', '').replace('\t', ''))) 

def write_data(filename, obj): 
    dump = repr(jelly(obj)) 
    level = 0 
    nice_dump = ['%s\n' % VERSION] 
    for char in dump: 
     if char == '[': 
      if level > 0: 
       nice_dump.append('\n' + '\t' * level) 
      level += 1 
     elif char == ']': 
      level -= 1 
     nice_dump.append(char) 
    open(filename, 'w').write(''.join(nice_dump))