【问题标题】:How to write lists "one by one" to a binary file in python?如何在python中将列表“一个一个”写入二进制文件?
【发布时间】:2011-05-11 15:02:23
【问题描述】:

我有一段代码在每次迭代中生成相当大的列表。为了节省内存,我想在生成列表后的每次迭代中将每个列表写入二进制文件。 我已经用文本文件尝试过这个(甚至在linux中将参数设置为“wb”)。 “wb”似乎对以二进制或文本格式写入的文件没有任何影响。此外,写入的文件很大,我不想要这个。我确信如果我能以二进制格式编写这些列表,这个文件会小得多。 谢谢

【问题讨论】:

  • 列表项的类型是什么?使用 NumPy 是一种选择吗?
  • 没有“[the] 二进制格式”这样的东西。有些格式与任何编码中的文本都不相似(分别是不应该的)。然而,有无数这样的格式和无数可能的格式。 你想要什么二进制格式?
  • @Sven:最终这个列表将作为特征向量馈送到分类器
  • @delnan:格式不是很重要,只要生成的文件不要太大。

标签: python list file binary


【解决方案1】:

由于您提到需要可压缩性,我建议使用 picklegzip 模块来压缩您的输出。您可以一次写和读回一个列表,下面是一个示例:

import gzip, pickle

output = gzip.open('pickled.gz', 'wb', compresslevel=9)

for x in range(10):
     output.write(pickle.dumps(range(10)) + '\n\n')
output.close()

然后使用生成器一次生成一个列表:

def unpickler(input):
    partial = []
    for line in input:
        partial.append(line)
        if line == '\n':
            obj = ''.join(partial)
            partial = []
            yield pickle.loads(obj)

input = gzip.open('pickled.gz', 'rb')
for l in unpickler(input):
    print l

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

【讨论】:

  • @zeekey:谢谢你的代码,但问题是,正如我所提到的,这个列表列表将非常大,首先要放入内存,然后再将其写入文件。我需要逐个列表写入文件,以免内存不足。
  • 您可以使用 '\n\n'(或类似名称)一次转储一个腌制对象以分隔记录。
  • @Hossein 我添加了一个示例,说明如何一次读取/写入一个列表,希望对您有所帮助!
【解决方案2】:

您可以使用cPickle 序列化您的列表并将结果转储到文件中。

【讨论】:

    【解决方案3】:

    'b' 标志唯一改变的是如何进行换行转换以支持 Windows。

    import pickle
    help(pickle.load)
    help(pickle.dump)
    
    # seems fairly efficient, taking 200bytes to store [1,2,...,100],
    # 2.7kb to store [1,2,...,1000],
    # and 29kb to store [1,2,...,10000]:
    >>> len(pickle.dumps(list(range(100))))
    208
    >>> len(pickle.dumps(list(range(1000))))
    2752
    >>> len(pickle.dumps(list(range(10000))))
    29770
    
    #create and store
    data = {}
    data['myList'] = [i for i in range(100)]
    with open('myfile.pickle', 'wb') as f:
        pickle.dump(data, f)
    
    # retrieve
    with open('myfile.pickle', 'wb') as f:
        data2 = pickle.load(f)
    print(data2)
    

    请注意,在任何用户提供的数据上使用 pickle 是不安全的。您需要以二进制模式打开正在写入的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2013-11-24
      • 2019-10-01
      • 2013-08-24
      • 1970-01-01
      相关资源
      最近更新 更多