Искать маринованные данные - PullRequest
1 голос
/ 23 апреля 2019

Можно ли перейти к определенной записи в маринованном файле на Python, пожалуйста?

например:.

import pickle

with open ('BinaryFile.dat', mode='wb') as MyFile:
    pickle.dump('Item1', MyFile)
    pickle.dump('Item2', MyFile)
    pickle.dump('Item3', MyFile)
    pickle.dump('Item4', MyFile)
    pickle.dump('Item5', MyFile)

with open('BinaryFile.dat', mode='rb') as MyReadFile:
    MyReadFile.seek(3)
    print(pickle.load(MyReadFile))

дает _pickle.UnpicklingError: invalid load key, '\x05'.

Ищет ли поиск даже выбранные данные? Нужно ли мне звонить pickle.load(MyReadFile) несколько раз вместо

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Записи Pickle могут быть объединены в файл, так что да, вы можете просто pickle.load(f) несколько раз, но сами файлы не индексируются таким образом, чтобы вы могли искать данную запись.

То, что делает ваш f.seek(3), ищет третий байт в файле, который находится в середине записи маринада и, следовательно, не может быть выбран.

Если вам нужен произвольный доступ,Возможно, вы захотите взглянуть на встроенный модуль shelve , который создает словарь-интерфейс поверх pickle с использованием файлового модуля базы данных.

(Еще один простой метод -быть просто иметь каталог, полный файлов рассола.)

0 голосов
/ 30 апреля 2019

Вы могли бы сделать это, явно сохранив начальное местоположение каждого элемента, используя метод файла tell() перед вызовом pickle.dump(), и позже применив эту информацию для изменения положения потока файла до pickle.load().

Вот что я имею в виду:

import pickle

indices = []

with open ('BinaryFile.dat', mode='wb') as MyFile:
    indices.append(MyFile.tell())
    pickle.dump('Item1', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item2', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item3', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item4', MyFile)
    indices.append(MyFile.tell())
    pickle.dump('Item5', MyFile)

with open('BinaryFile.dat', mode='rb') as MyReadFile:
    MyReadFile.seek(indices[3])
    print(pickle.load(MyReadFile))  # -> Item4

Конечно, чтобы это было действительно полезно, вам также необходимо сохранить данные о местоположении в списке indices.

...