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

Тема в разделе "Perl, Python, Ruby", создана пользователем bsk, 19 апр 2012.

  1. bsk

    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()
    Ещё такой вопрос. Открываю файл на дозапись. Как вывести все данные из файла в нормальном виде? Цикл который в коде выводит что-то непонятное.
     
  2. zardoz

    zardoz Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    84
    Симпатии:
    59
    По поводу исключения 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 нравится это.
  3. zardoz

    zardoz Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    84
    Симпатии:
    59
    Про нормальный вид.

    В 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()
     
    german white и bsk нравится это.