Найти - Пользователи
Полная версия: Запись и чтение из бинарного файла
Начало » Python для новичков » Запись и чтение из бинарного файла
1
Poputchik77
Учусь пайтону самостоятельно, нужно объяснение. Записываю данные в файл (двоичный) с помощью параметра ab (добавляю кортеж в список), а когда открываю бинарный файл на чтение то извлекается только самый первый записанный кортеж, а остальных нет.
doza_and
Бинарность записи определяется форматом dump
pickle.dump(scores, records,2)
Poputchik77
извлекается только самый первый записанный кортеж
так вы и читали один раз.
Poputchik77
а остальных нет.
Утверждение вами не обосновано.
Poputchik77
Не совсем понял, зачем аргумент 2? Вроде же функция pickle.dump принимает только 2 аргумента что сохраняем(в моем случае дописываем) и куда. Вы наверно не правильно поняли что я пытаюсь понять. Этот код - домашняя работа так сказать и было дано задание в программе “викторина” присвоить каждому вопросу номинал за правильный ответ, и по прохождению викторины результат законсервировать в бинарный файл. Так вот пройдя викторину и получив результат (в виде кортежа имя-результат) я добавляю его в список который и сохраняется в создаваемом файле .dat Для проверки я его открываю вновь на чтение. Когда второй раз прохожу программу и создаю новый кортеж (имя-результат) и дописываю с помощью параметра ab его в бинарный файл, то при открытии его на чтение там только первый сохраненный результат. Пробовал отдельно открывать файл, там только первый результат.
Poputchik77
Разобрался что за аргумент 2. Просто его нигде не писали , по молчанию он равен False и пишет данные не в двоичном а в текстовом формате, но вопрос от этого не решился. Дозапись в бинарный файл не происходит.
py.user.next
Попробуй запустить этот:
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
Тут смысл в том что играя в викторину человек пишет свое имя и получает определенный результат, эти данные и дописываются в отдельный от программы файл. После чего программа закрывается, следующий человек поиграв в викторину оставляет новые данные имя-результат которые должны дописаться в этот же файл, а при прочтении в файле находится только один результат, самый первый. Проблем нет еслиб я сразу задавал значения при одном прогоне кода, но необходимо чтоб данные дописывались и потом были доступны (ну например отсортировать и показать лучшие результаты). Сейчас изучаю про полки, может поможет.
py.user.next
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]]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB