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

How to save files with the lowest possible weight

我正在尝试使用 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”占用更少,同时会降低整个文件的重量。是否有其他更有效的方法将此类数据存储在文件中?

不是引号增加了大小,而是因为它是一个字符串,所以它必须这样表示 - 当腌制时,通过 optcodes。

Pickle 也不是真正打算非常 space-高效(甚至快速),除非你在 pickling 时至少使用 protocol=2

如果您在存储字符串时追求最小大小(不压缩),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 个字节。