当一个列表比较大时,想要把列表(或者其他类型)永久储存,或者用文件中转。那么怎么把列表储存在文件中呢?
本周我要运算一个很大的列表,该列表的处理又横跨多个模块,如果使用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:gting405@163.com