Форум сайта python.su
0
Учусь пайтону самостоятельно, нужно объяснение. Записываю данные в файл (двоичный) с помощью параметра ab (добавляю кортеж в список), а когда открываю бинарный файл на чтение то извлекается только самый первый записанный кортеж, а остальных нет.
Прикреплённый файлы:
7_2 ru.py (3,3 KБ)
Офлайн
253
Бинарность записи определяется форматом dump
pickle.dump(scores, records,2)
Poputchik77так вы и читали один раз.
извлекается только самый первый записанный кортеж
Poputchik77Утверждение вами не обосновано.
а остальных нет.
Офлайн
0
Не совсем понял, зачем аргумент 2? Вроде же функция pickle.dump принимает только 2 аргумента что сохраняем(в моем случае дописываем) и куда. Вы наверно не правильно поняли что я пытаюсь понять. Этот код - домашняя работа так сказать и было дано задание в программе “викторина” присвоить каждому вопросу номинал за правильный ответ, и по прохождению викторины результат законсервировать в бинарный файл. Так вот пройдя викторину и получив результат (в виде кортежа имя-результат) я добавляю его в список который и сохраняется в создаваемом файле .dat Для проверки я его открываю вновь на чтение. Когда второй раз прохожу программу и создаю новый кортеж (имя-результат) и дописываю с помощью параметра ab его в бинарный файл, то при открытии его на чтение там только первый сохраненный результат. Пробовал отдельно открывать файл, там только первый результат.
Офлайн
0
Разобрался что за аргумент 2. Просто его нигде не писали , по молчанию он равен False и пишет данные не в двоичном а в текстовом формате, но вопрос от этого не решился. Дозапись в бинарный файл не происходит.
Офлайн
857
Попробуй запустить этот:
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().
то извлекается только самый первый записанный кортеж, а остальных нет
Отредактировано py.user.next (Май 23, 2015 07:43:11)
Офлайн
0
Тут смысл в том что играя в викторину человек пишет свое имя и получает определенный результат, эти данные и дописываются в отдельный от программы файл. После чего программа закрывается, следующий человек поиграв в викторину оставляет новые данные имя-результат которые должны дописаться в этот же файл, а при прочтении в файле находится только один результат, самый первый. Проблем нет еслиб я сразу задавал значения при одном прогоне кода, но необходимо чтоб данные дописывались и потом были доступны (ну например отсортировать и показать лучшие результаты). Сейчас изучаю про полки, может поможет. 
Офлайн
857
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]] >>>
Отредактировано py.user.next (Май 23, 2015 08:47:23)
Офлайн