Poputchik77
Май 22, 2015 11:24:57
Учусь пайтону самостоятельно, нужно объяснение. Записываю данные в файл (двоичный) с помощью параметра ab (добавляю кортеж в список), а когда открываю бинарный файл на чтение то извлекается только самый первый записанный кортеж, а остальных нет.
doza_and
Май 22, 2015 22:39:07
Бинарность записи определяется форматом dump
pickle.dump(scores, records,2)
Poputchik77
извлекается только самый первый записанный кортеж
так вы и читали один раз.
Poputchik77
а остальных нет.
Утверждение вами не обосновано.
Poputchik77
Май 23, 2015 07:07:12
Не совсем понял, зачем аргумент 2? Вроде же функция pickle.dump принимает только 2 аргумента что сохраняем(в моем случае дописываем) и куда. Вы наверно не правильно поняли что я пытаюсь понять. Этот код - домашняя работа так сказать и было дано задание в программе “викторина” присвоить каждому вопросу номинал за правильный ответ, и по прохождению викторины результат законсервировать в бинарный файл. Так вот пройдя викторину и получив результат (в виде кортежа имя-результат) я добавляю его в список который и сохраняется в создаваемом файле .dat Для проверки я его открываю вновь на чтение. Когда второй раз прохожу программу и создаю новый кортеж (имя-результат) и дописываю с помощью параметра ab его в бинарный файл, то при открытии его на чтение там только первый сохраненный результат. Пробовал отдельно открывать файл, там только первый результат.
Poputchik77
Май 23, 2015 07:34:15
Разобрался что за аргумент 2. Просто его нигде не писали , по молчанию он равен False и пишет данные не в двоичном а в текстовом формате, но вопрос от этого не решился. Дозапись в бинарный файл не происходит.
py.user.next
Май 23, 2015 07:38:49
Попробуй запустить этот:
import pickle
with open('file.txt', 'ab') as f:
pickle.dump([1, 2, 3], f)
with open('file.txt', 'ab') as f:
pickle.dump([4, 5, 6], f)
with open('file.txt', 'rb') as f:
print(pickle.load(f))
print(pickle.load(f))
Poputchik77
то извлекается только самый первый записанный кортеж, а остальных нет
Один load() извлекает один dump().
Poputchik77
Май 23, 2015 08:27:28
Тут смысл в том что играя в викторину человек пишет свое имя и получает определенный результат, эти данные и дописываются в отдельный от программы файл. После чего программа закрывается, следующий человек поиграв в викторину оставляет новые данные имя-результат которые должны дописаться в этот же файл, а при прочтении в файле находится только один результат, самый первый. Проблем нет еслиб я сразу задавал значения при одном прогоне кода, но необходимо чтоб данные дописывались и потом были доступны (ну например отсортировать и показать лучшие результаты). Сейчас изучаю про полки, может поможет.
py.user.next
Май 23, 2015 08:40:47
Poputchik77
После чего программа закрывается, следующий человек поиграв в викторину оставляет новые данные имя-результат которые должны дописаться в этот же файл, а при прочтении в файле находится только один результат, самый первый.
Ну, и загружал бы их в цикле.
>>> import pickle
>>> import io
>>>
>>> f = io.BytesIO()
>>> pickle.dump([1, 2, 3], f)
>>> pickle.dump([4, 5, 6], f)
>>> f.seek(0)
0
>>>
>>> lst = []
>>> while True:
... try:
... lst.append(pickle.load(f))
... except EOFError:
... break
...
>>> lst
[[1, 2, 3], [4, 5, 6]]
>>>