私はいくつかのデータを作成し、次のように数回保存しました。
with open('filename', 'a') as f:
pickle.dump(data, f)
ファイルのサイズが大きくなるたびに、ファイルを開くとき
with open('filename', 'rb') as f:
x = pickle.load(f)
前回のデータしか見えません。どうすればファイルを正しく読み取ることができますか?
私はいくつかのデータを作成し、次のように数回保存しました。
with open('filename', 'a') as f:
pickle.dump(data, f)
ファイルのサイズが大きくなるたびに、ファイルを開くとき
with open('filename', 'rb') as f:
x = pickle.load(f)
前回のデータしか見えません。どうすればファイルを正しく読み取ることができますか?
回答:
Pickleは、一度に1つのオブジェクトをシリアル化し、1つのオブジェクトを読み戻します。pickle化されたデータはファイルに順番に記録されます。
単純に行うpickle.load
場合は、ファイルにシリアル化された最初のオブジェクトを読み取る必要があります(作成した最後のオブジェクトではありません)。
最初のオブジェクトのシリアル化を解除した後、ファイルポインタは次のオブジェクトの先頭にあります-単にpickle.load
もう一度呼び出すと、次のオブジェクトが読み取られます-ファイルの終わりまでそれを行います。
objects = []
with (open("myfile", "rb")) as openfile:
while True:
try:
objects.append(pickle.load(openfile))
except EOFError:
break
以下は、pickleファイルの書き込みと読み取りの方法の例です。ピクルスデータをファイルに追加し続ける場合は、必要なものが見つかるか、ファイルの最後に到達して例外が生成されるまで、ファイルからの読み取りを続行する必要があることに注意してください。それが最後の関数が行うことです。
import os
import pickle
PICKLE_FILE = 'pickle.dat'
def main():
# append data to the pickle file
add_to_pickle(PICKLE_FILE, 123)
add_to_pickle(PICKLE_FILE, 'Hello')
add_to_pickle(PICKLE_FILE, None)
add_to_pickle(PICKLE_FILE, b'World')
add_to_pickle(PICKLE_FILE, 456.789)
# load & show all stored objects
for item in read_from_pickle(PICKLE_FILE):
print(repr(item))
os.remove(PICKLE_FILE)
def add_to_pickle(path, item):
with open(path, 'ab') as file:
pickle.dump(item, file, pickle.HIGHEST_PROTOCOL)
def read_from_pickle(path):
with open(path, 'rb') as file:
try:
while True:
yield pickle.load(file)
except EOFError:
pass
if __name__ == '__main__':
main()
私は(ほとんどの)Pickleファイルをブラウザで直接開くソフトウェアツールを開発しました(何も転送されないため、100%プライベートです):
あなたはそれで何もしていません、あなたはファイルをロードしているだけです。
for line in x:
print x
各行を印刷します。(ステートメントの2番目に)
open('filename', 'wb')