Turşu dosyası nasıl okunur?


91

Bazı verileri oluşturdum ve birkaç kez şu şekilde sakladım:

with open('filename', 'a') as f:
        pickle.dump(data, f)

Dosya boyutu her arttığında, ancak dosyayı açtığımda

with open('filename', 'rb') as f:
    x = pickle.load(f)

Yalnızca son seferdeki verileri görebiliyorum. Dosyayı nasıl doğru okuyabilirim?


1
Dosyanıza nesneler ekliyorsunuz. Seçtiğinizde, sadece ilk girişi kaldırırsınız. Tüm bu girişlere ihtiyacınız olduğundan emin misiniz? Değilse - değiştirinopen('filename', 'wb')
Andrey

Evet, tüm girişlere ihtiyacım var. Dosyaların boyutu, hepsini içerdiğini gösterir.
Kenenbek Arzymatov

1
O zaman @jsbueno cevabında haklı.
Andrey


Turşu dosyalarını doğrudan tarayıcınızda görüntülemek için bir şey geliştirdim: pickleviewer.com
Christo S. Christov

Yanıtlar:


98

Pickle, bir seferde tek bir nesneyi serileştirir ve tek bir nesneyi geri okur - turşu veriler dosyaya sırayla kaydedilir.

Basitçe yaparsanız pickle.load, dosyaya serileştirilmiş ilk nesneyi okuyor olmalısınız (yazdığınız sonuncusu değil).

İlk nesnenin serileştirilmesinden sonra, dosya işaretçisi sonraki nesnenin başlangıcındadır - basitçe pickle.loadtekrar çağırırsanız , sonraki nesneyi okuyacaktır - dosyanın sonuna kadar bunu yapın.

objects = []
with (open("myfile", "rb")) as openfile:
    while True:
        try:
            objects.append(pickle.load(openfile))
        except EOFError:
            break

27

Pandaların 0.22+ parçası olarak bir read_pickle işlevi vardır.

import pandas as pd

object = pd.read_pickle(r'filepath')

6

Aşağıda bir turşu dosyasını nasıl yazıp okuyabileceğinize dair bir örnek verilmiştir. Dosyaya turşu verisi eklemeye devam ederseniz, istediğinizi bulana kadar veya dosyanın sonuna ulaşarak bir istisna oluşturulana kadar dosyadan okumaya devam etmeniz gerekeceğini unutmayın. Son işlevin yaptığı budur.

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()


-27

Onunla hiçbir şey yapmıyorsunuz, sadece dosyayı yüklüyorsunuz.

for line in x:
    print x

her satırı yazdıracaktır. (İfade ile ikinci olarak)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.