我正在尝试使用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”,同时会减少整个文件的重量。是否有其他更有效的方法将这些数据存储在文件中?
答案 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个字节用于此数据。