如何把列表儲存在文件中

當一個列表比較大時,想要把列表(或者其他類型)永久儲存,或者用文件中轉。那麼怎麼把列表儲存在文件中呢?

本週我要運算一個很大的列表,該列表的處理又橫跨多個模塊,如果使用return傳遞,就太佔內存了。

普通的文件只能存儲str類型,需要把列表中的每一個元素轉化成str,而且還要注意適時插入分隔符。比如我用‘ ’去分隔每一個元素。

list = [big list]
    for item in list:
        data_file.write('%s ' %item)
如果要儲存多個列表,那麼需要在列表中間插入‘\n’

 for ugraph in [ugraph_network, ugraph_ER]:
        nodes_random = random_order(ugraph)
        list = compute_resilience(ugraph, nodes_random)
        for item in list:
            data_file.write('%s ' %item)
        data_file.write('\n')
這樣我們就儲存了列表到文件中。列表的每個元素以‘ ’分隔,列表之間以‘\n’分隔。

讀取的時候只需要先以'\n'分隔成兩個列表,然後再把每個列表中元素轉化成int(float)即可。

data_file = open('list.dat', 'r')
data_text = data_file.read()
data_lines = data_text.split('\n')
data_file.close()
list1 = lists[0].split(' ')
list1.pop(-1)
list2 = data_lines[1].split(' ')
list2.pop(-1)
這裏需要注意的是data_lines的大小是3,因爲最後有一個'\n'。每個列表的最後也有一個‘ ’,需要去掉。


可以體會到,這樣儲存列表的效率是很低的。需要把列表迭代一次,轉化爲字符串。讀取的時候則要再反向做一次,而且需要反覆測試,以免帶入不必要的元素

更重要的是,如果列表中的元素有不能轉化爲字符串的元素的話,基本就無法進行這樣的處理。

如果只是臨時儲存,那麼pickle模塊真是太方便了。

result = [list1,list2]
data_file = open('list.p', 'wb')
pickle.dump(result, data_file)
data_file.close()
因爲pickle文件只能儲存一個變量,我把兩個列表儲存在一個列表中,然後再把這個列表儲存在pickle文件中。

讀取的時候也很簡單。

data_file = open('list.p', 'rb') 
lists = pickle.load(data_file)
list1 = lists[0]
list2 = lists[1]
這樣就可以直接使用了。而且沒有其他元素的干擾。


——————————————————

github主頁:https://github.com/gt11799 

E-mail:[email protected]






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章