2017-12-11 3 views
0

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]] 

そして、私のベース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

引用符は文字列リテラルを示します。あなたは文字列を格納しています。 '190'は整数であり、おそらく32ビットを使用します。 "190"はおそらく32ビット、1文字あたり8ビット、ヌルターミネータも使用する文字列です。これらはおおまかな見積もりですが、他の人がより良い参照で回答できるはずです。 –

答えて

3

サイズを大きくする引用符ではなく、文字列であるため、optcodesを使用してピクルスしたときに表示する必要があります。

また、ピックリング中に少なくとも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バイトを要する。

+0

説明をありがとう! –

+0

Meh ...そのデータを** 14 **バイトでエンコードするのは簡単です。 (すべてのサブリストが同じ最初の値を持っているという事実を使用していません。) –

+0

興味深いです。どうやって? –

関連する問題