我可以流式传输Python pickle列表,元组或其他可迭代数据类型吗?

www*_*iam 9 python streaming pickle ipython

我使用逗号/制表符分隔的数据文件,通常可能如下所示:

key1,1,2.02,hello,4
key2,3,4.01,goodbye,6
...
Run Code Online (Sandbox Code Playgroud)

我可以在Python中阅读并预处理这个列表,如下所示:

[ [ key1, 1, 2.02, 'hello', 4 ], [ key2, 3, 4.01, 'goodbye', 6 ] ]
Run Code Online (Sandbox Code Playgroud)

有时,我喜欢将这个列表列表保存为pickle,因为它保留了不同类型的条目.但是,如果pickle文件很大,那么以流式方式读回这个列表列表会很棒.

在Python中,要将文本文件作为流加载,我使用follwoing打印出每一行:

with open( 'big_text_file.txt' ) as f:
    for line in f:
        print line
Run Code Online (Sandbox Code Playgroud)

我可以为Python列表做类似的事情,即:

import pickle
with open( 'big_pickled_list.pkl' ) as p:
    for entry in pickle.load_streaming( p ): # note: pickle.load_streaming doesn't exist
        print entry
Run Code Online (Sandbox Code Playgroud)

有没有像"load_streaming"这样的泡菜功能?

mat*_*ata 12

这会奏效.

但是,从文件中取出一个对象,然后打印文件内容的其余部分 stdout

你能做的是:

import cPickle
with open( 'big_pickled_list.pkl' ) as p:
    try:
        while True:
            print cPickle.load(p)
    except EOFError:
        pass
Run Code Online (Sandbox Code Playgroud)

这将从文件中取消所有对象,直到达到EOF.


如果你想要一些类似的东西for line in f:,你可以轻松地将其包装起来:

def unpickle_iter(file):
    try:
        while True:
             yield cPickle.load(file)
    except EOFError:
        raise StopIteration
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

with open('big_pickled_list.pkl') as file:
    for item in unpickle_iter(file):
        # use item ...
Run Code Online (Sandbox Code Playgroud)