Як прочитати файл розсолу?


85

Я створив деякі дані і кілька разів зберігав їх так:

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

Щоразу розмір файлу збільшувався, але коли я відкривав файл

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

Я бачу лише дані останнього часу. Як я можу правильно прочитати файл?


1
Ви додаєте об’єкти до свого файлу. Коли ви знімаєте пікет, ви знімаєте лише перший запис. Ви впевнені, що вам потрібні всі ці записи? Якщо ні - змініть наopen('filename', 'wb')
Андрій

Так, мені потрібні всі записи. Розмір файлів показує, що вони містять усе.
Кененбек Арзиматов

1
Тоді @jsbueno має рацію у своїй відповіді.
Андрій


Я створив щось для перегляду маринованих файлів безпосередньо у вашому браузері: pickleviewer.com
Крісто С.

Відповіді:


91

Pickle серіалізує окремий об'єкт за раз і зчитує назад один об'єкт - замариновані дані записуються послідовно у файл.

Якщо ви просто це зробите, pickle.loadвам слід прочитати перший об'єкт, серіалізований у файлі (не останній, як ви писали).

Після десеріалізації першого об’єкта, вказівник на файл знаходиться на початку наступного об’єкта - якщо ви просто зателефонуєте pickle.loadще раз, він прочитає цей наступний об’єкт - робіть це до кінця файлу.

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

21

Існує функція read_pickle як частина pandas 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')

6

Далі наведено приклад того, як ви можете писати та читати файл маринованого огірка. Зауважте, що якщо ви продовжуєте додавати дані про соління до файлу, вам потрібно буде продовжувати читати з файлу, поки не знайдете те, що ви хочете, або не буде створено виняток, досягнувши кінця файлу. Ось що робить остання функція.

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

6

Я розробив програмний інструмент, який відкриває (більшість) файлів Pickle безпосередньо у вашому браузері (нічого не передається, тому він на 100% приватний):

https://pickleviewer.com/


-25

Ви з цим нічого не робите, ви лише завантажуєте файл.

for line in x:
    print x

надрукує кожен рядок. (У другому із заявою)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.