file.seek () и file.write () проблема при записи в двоичный файл - PullRequest
0 голосов
/ 06 октября 2018

Итак, мой код настроен на чтение массива и запись его в двоичный файл.

import sys
import pickle
offset = 0
UncompressedLookup = {}
f = open('/Users/shivangisingh/Desktop/InformationRetrieval/UCIndex.txt', 'wb')
for k, v in uncompressed_dic.items():
    UncompressedLookup[k] = {'offset': offset,
                             'size': sys.getsizeof(v),
                             '#ofdocumnetsInCollection': termstats[k]['#ofdocumnetsInCollection'] ,
                             '#ofoccurancesInCollection' : termstats[k]['#ofoccurancesInCollection'] }
    f.seek(offset)
    pickle.dump(v,f)
    offset= f.tell()

f.close()

Когда я печатаю несколько экземпляров UncompressedLookup:

i=0
for k, v in UncompressedLookup.items():
    if (i==5):
        break
    print(k,v)

Я получаю:

scene {'offset': 0, 'size': 19152, '#ofdocumnetsInCollection': 747, '#ofoccurancesInCollection': 779}
venice {'offset': 5071, 'size': 1096, '#ofdocumnetsInCollection': 25, '#ofoccurancesInCollection': 78}

Это странно, потому что, когда я начинаю с 0 и собираю 19152 байта данных, следующее смещение должно быть в 19152, но, как мы видим, оно в 5071. Я запутался.

1 Ответ

0 голосов
/ 06 октября 2018

Как отметил @Alex Hall в комментарии, sys.getsizeof() не имеет никакого отношения к размеру данных, помещаемых в файл pickle.Чтобы определить, что вам нужно / вы хотите знать, вы можете временно сохранить маринованные данные в строку, которую вы можете измерить, а затем вручную записать их в файл.

В вашем вопросе нет кода, который воспроизводитпроблема.Но вот простой пример кода, который показывает, как выбрать элементы в словаре и создать индекс, который можно использовать позже - вместе с seek() - для случайного считывания любого элемента, который был в нем.(Если, конечно, это ваша конечная цель.)

import random
import pickle

uncompressed_dic = {'a': 1, 'b': (2, 3, 4), 'c': 'text'}  # Sample data.

with open('UCIndex.txt', 'wb') as f:
    UncompressedLookup = {}
    offset = 0

    for key, value in uncompressed_dic.items():
        pkldata = pickle.dumps(value)
        size = len(pkldata)
        UncompressedLookup[key] = {'offset': offset, 'size': size}
        f.write(pkldata)
        offset += size


# Read items back in random order using UncompressedLookup dict.
keys = list(uncompressed_dic.keys())
random.shuffle(keys)

i = 0
while keys:
    if i >= 5:
        break
    key = keys.pop()
    offset = UncompressedLookup[key]['offset']
    size = UncompressedLookup[key]['size']
    with open('UCIndex.txt', 'rb') as f:
        f.seek(offset)
        pkldata = f.read(size)
        value = pickle.loads(pkldata)
    print((key, value))

Пример вывода:

('b', (2, 3, 4))
('c', 'text')
('a', 1)
...