Уведомления

Группа в Telegram: @pythonsu

#1 Май 22, 2015 11:24:57

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

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

Прикреплённый файлы:
attachment 7_2 ru.py (3,3 KБ)

Офлайн

#2 Май 22, 2015 22:39:07

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

Бинарность записи определяется форматом dump

pickle.dump(scores, records,2)
Poputchik77
извлекается только самый первый записанный кортеж
так вы и читали один раз.
Poputchik77
а остальных нет.
Утверждение вами не обосновано.



Офлайн

#3 Май 23, 2015 07:07:12

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

Не совсем понял, зачем аргумент 2? Вроде же функция pickle.dump принимает только 2 аргумента что сохраняем(в моем случае дописываем) и куда. Вы наверно не правильно поняли что я пытаюсь понять. Этот код - домашняя работа так сказать и было дано задание в программе “викторина” присвоить каждому вопросу номинал за правильный ответ, и по прохождению викторины результат законсервировать в бинарный файл. Так вот пройдя викторину и получив результат (в виде кортежа имя-результат) я добавляю его в список который и сохраняется в создаваемом файле .dat Для проверки я его открываю вновь на чтение. Когда второй раз прохожу программу и создаю новый кортеж (имя-результат) и дописываю с помощью параметра ab его в бинарный файл, то при открытии его на чтение там только первый сохраненный результат. Пробовал отдельно открывать файл, там только первый результат.

Офлайн

#4 Май 23, 2015 07:34:15

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

Разобрался что за аргумент 2. Просто его нигде не писали , по молчанию он равен False и пишет данные не в двоичном а в текстовом формате, но вопрос от этого не решился. Дозапись в бинарный файл не происходит.

Офлайн

#5 Май 23, 2015 07:38:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

Попробуй запустить этот:

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)

Офлайн

#6 Май 23, 2015 08:27:28

Poputchik77
Зарегистрирован: 2015-04-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

Тут смысл в том что играя в викторину человек пишет свое имя и получает определенный результат, эти данные и дописываются в отдельный от программы файл. После чего программа закрывается, следующий человек поиграв в викторину оставляет новые данные имя-результат которые должны дописаться в этот же файл, а при прочтении в файле находится только один результат, самый первый. Проблем нет еслиб я сразу задавал значения при одном прогоне кода, но необходимо чтоб данные дописывались и потом были доступны (ну например отсортировать и показать лучшие результаты). Сейчас изучаю про полки, может поможет.

Офлайн

#7 Май 23, 2015 08:40:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Запись и чтение из бинарного файла

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version