當一個列表比較大時,想要把列表(或者其他類型)永久儲存,或者用文件中轉。那麼怎麼把列表儲存在文件中呢?
本週我要運算一個很大的列表,該列表的處理又橫跨多個模塊,如果使用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]