python 2.7 cPickle追加List

时间:2016-04-26 15:51:38

标签: python-2.7 pickle

我正在尝试使用 python 2.7 中的cPickle附加到列表中,但它不会附加。

代码:

import cPickle
import numpy
a = numpy.array([[1, 2],[3, 4]]);
output = open("1.pkl",'wb');
cPickle.dump(a,output);
a = numpy.array([[4, 5],[6, 7]]);
output = open("1.pkl",'ab');
cPickle.dump(a,output);
print(cPickle.load(open("1.pkl",'rb')));

输出:

[[1 2]
[3 4]]

我正在使用此方法在

之前将数组附加到文本文件中

代码:

a = numpy.array([[1, 2],[3, 4]]);
text_file = open("1.txt", "w");
numpy.savetxt(text_file, a);
text_file.close();
a = numpy.array([[4, 5],[6, 7]]);
text_file = open("1.txt", "a");
numpy.savetxt(text_file, a);
text_file.close();

text_file = open("1.txt", "r");
print(text_file.read());

输出:

1.000000000000000000e+00 2.000000000000000000e+00
3.000000000000000000e+00 4.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00
6.000000000000000000e+00 7.000000000000000000e+00

我用它来编写我为Power Systems设置的python模拟的数据。输出数据大约为7GB。写作过程大大减慢了模拟速度。我读到cPickle可以让写作过程更快。

如何在不读取整个数据的情况下附加到cPickle输出文件?

或者是否有更好的替代cPickle来提高写作速度?

1 个答案:

答案 0 :(得分:0)

我不相信你可以附加到泡菜上,或者以一种有意义的方式。

如果您只是获取对象的当前序列化版本并在文件末尾添加另一个序列化对象,那么它就不会将第二个对象神奇地附加到原始列表中。

您需要读取原始对象,在Python中附加它,然后将其转储回来。

import cPickle as pickle
import numpy as np

filename = '1.pkl'

a = np.array([[1, 2],[3, 4]])
b = np.array([[4, 5],[6, 7]])

# dump `a`
with open(filename,'wb') as output_file:
    pickle.dump(a, output, -1)

# load `a` and append `b` to it
with open(filename, 'rb') as output_file:
    old_data = pickle.load(output_file)
    new_data = np.vstack([old_data,a])

# dump `new_data`
with open(filename, 'wb') as output_file:
    pickle.dump(new_data, output_file, -1)

# test
with open(filename, 'rb') as output_file:
    print(pickle.load(output_file))

第二次阅读您的问题后,您声明您不想再读取整个数据。我想这不会回答你的问题,是吗?