2013-12-18 29 views
0

我的文本文件看起來像這樣:如何通過我的文本文件添加到字典

{'testyear3': 20, 'testyear6': '0', 'testyear5': '0', 'testyear4': '0'} 

它總是這個樣子,我不能改變文本文件的順序,或者它是如何放置的過程中我的計劃,我寫的是因此在程序中的文本文件,始終將恢復上述順序的末尾到文本文件所做的代碼

with open ("totals.txt", 'w') as f27: 
    f27.write(str(totaldict)) 

的字典。我會如何將文本文件寫入字典格式?或者我將不得不改變我寫入文本文件的方式?

+0

如果密鑰總是「testyearX」那麼你爲什麼使用字典而不是列表?列表將保存順序,並將簡化獲取條目 – TehTris

+0

...或OrderedDict ...或熊貓'DataFrame' ...或... – ely

回答

4

你想改變你寫字典到文本文件的方式。 JSON格式會更容易處理(與json module):

import json 

# saving 
with open("totals.txt", 'w') as f27: 
    json.dump(totaldict, f27) 

# loading 
with open("totals.txt", 'r') as f27: 
    totaldict = json.load(f27) 

但詞典不維護任何特定的順序;他們是無序收藏由設計。如果您想以特定順序存儲項目,則必須使用不同的數據結構(如列表),或者對信息進行分類並使用自定義格式。

+0

python沒有'LinkedHashMap'類型的結構嗎? –

+0

@SteveP .:你的意思是['collections.OrderedDict()'](http://docs.python.org/2/library/collections.html#collections.OrderedDict)?如果以JSON形式寫出,則在再次讀取時不會保留排序,因爲將從該字典創建常規字典。 –

+0

@MartijnPieters:雖然你可以使用'object_pairs_hook'。 – DSM

0

我使用Python的原有的語法分析器:

def read_dict(fname, src = None): 
    if src is None : 
    src = StringIO.StringIO(fname) 
    src_global = { } 
    locals = {} 
    comp_obj = compile(src, fname, 'exec') 
    eval(comp_obj, src_global, locals) 
    return locals 

此加載一個文件,基本上解析它,然後返回解析過程中創建的局部變量。

您需要在代碼中加上一些變量名稱,然後返回該變量而不是locals

當然,這可能是一個矯枉過正的問題,但我有很少的字典格式的Python腳本的文件。我想這是做到這一點的一種方法。

+0

不要。不是當有'ast.literal_eval'代替時。但一般來說,像JSON這樣的標準格式要好得多。 –

+0

@MartijnPieters那麼我包含所有的變量。我知道執行任意腳本不是最好的想法。由於之前的決定,我被迫堅持格式化。儘管我熱衷於轉向未來。我會研究'literal_eval'。 – luk32

相關問題