[python] Консервация и расконсервация

bsk

Постоялец
Регистрация
12 Фев 2010
Сообщения
145
Реакции
8
Добрый день! Изучаю питон и столкнулся со следующими вопросами:

Код:
import pickle
name = ["fsdfsd", "34325"]
file = open("test.dat", "wb+")
pickle.dump(name, file)
name = pickle.load(file)
print(name)
file.close()
Открываю файл сразу на запись и чтение. Почему возникает ошибка EOFError?

Код:
import pickle
name = ["fsdfsd", "1418"]
file = open("records.dat", "ab")
pickle.dump(name, file)
file.close()
file = open("records.dat", "rb")
for name in file:
    name = pickle.load(file)
    print(name)
file.close()
Ещё такой вопрос. Открываю файл на дозапись. Как вывести все данные из файла в нормальном виде? Цикл который в коде выводит что-то непонятное.
 
По поводу исключения EOFError.
Ты когда записываешь в новый файл, курсор в файле(текущая позиция) оказывается в конце.
Поэтому сразу после записи нечего читать.
Если хочешь прочитать, используя этот же файловый дескриптор, надо установить курсор на начало файла с помощью seek.
Вот так будет выглядеть код:
Код:
import pickle
name = ["fsdfsd", "34325"]
f = open("test.dat", "wb+")
pickle.dump(name, f)
f.seek(0)
name = pickle.load(f)
print(name)
f.close()
 
  • Нравится
Реакции: bsk
Про нормальный вид.

В 7 строке цикл осуществляется над файловым дескриптором, а не над распакованными данными.
В этом случае, на каждый проход цикла переменной name присваивается очередная строка из файла.
Поэтому pickle не может распаковать данные(строка 8), т.к. вместо целого файла получает на вход только первую строку.

Правильный код будет выглядеть так:
Код:
import pickle
name = ["fsdfsd", "1418"]
file = open("records.dat", "ab")
pickle.dump(name, file)
file.close()
file = open("records.dat", "rb")
names = pickle.load(file) # распаковка
for name in names: # цикл по элементам списка
    print(name) # печать элемента
file.close()
 
Назад
Сверху