如何以尽可能低的重量保存文件

时间:2017-12-11 22:16:38

标签: python python-3.x list pickle

我正在尝试使用pickle将一些数据保存到文件中。 我的起始列表有以下形式:

 a1 = [[190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 60, 62], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 61, 65], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 60, 63], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 61, 65], [190, 187, 27, 24, 4, 1, 0, 2, 6, 8, 48, 50], [190, 187, 27, 24, 4, 1, 0, 2, 6, 9, 61, 64], [190, 187, 27, 24, 4, 1, 0, 2, 6, 8, 48, 51]]

仅留下子列表中的第一个和最后一个数字后:

a2 = [[190, 62], [190, 65], [190, 63], [190, 65], [190, 50], [190, 64], [190, 51]]

在我的base-32编码之后:

a3 = [['5x', '1x'], ['5x', '21'], ['5x', '1c'], ['5x', '21'], ['5x', '1o'], ['5x', '20'], ['5x', '1p']]

列表'a1'的文件有224个字节,列表'a2'有84个字节,列表'a3'有182个字节。为什么带有'a3'列表的文件大于带有'a2'列表的文件?引号放大文件? 在我看来,例如,“5x”将花费少于“190”,同时会减少整个文件的重量。是否有其他更有效的方法将这些数据存储在文件中?

1 个答案:

答案 0 :(得分:3)

不是增加大小的引号,而是它是一个字符串,因此它必须被表示为 - 当通过optcodes进行pickle时。

除非你在酸洗时至少使用protocol=2,否则Pickle也不是非常节省空间(甚至是快速)。

如果您在存储字符串时遵循最小尺寸(没有压缩),CSV应该这样做:

import csv

a3 = [['5x', '1x'], ['5x', '21'], ['5x', '1c'], ['5x', '21'], ['5x', '1o'],
      ['5x', '20'], ['5x', '1p']]

with open("saved_data.csv", "wt", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a3)

这将产生一个49字节的CSV文件(saved_data.csv),你不能低于没有压缩的文件。相比之下,即使用protocol=4进行酸洗也需要93个字节用于此数据。