Как вы обновляете записи с помощью модуля pickle? - PullRequest
0 голосов
/ 09 мая 2020

Итак, я пытаюсь обновить некоторые записи, которые я сохранил в двоичном файле с помощью pickle.dump .. Я новичок и не уверен, почему это не работает. Может ли кто-нибудь помочь?
Вот код:

def modify():
    f=open('employee.dat','ab+')

    e=int(input('Enter Employee Number:'))
    while True:
        try:
            rec=pickle.load(f)
            for a in rec:
                if a[0]==e:
                    print('Presently:')
                    print('Emp_no.         ' , a[0])
                    print('Employee Name:  ' , a[1])
                    print('Salary:         ' , a[2])

                    a[0]=int(input('Enter NEW Employee Number:'))
                    a[1]=input('Enter NEW employee name      :')
                    a[2]=int(input('Enter NEW salary         :'))

                    pickle.dump(rec,f)
                    break

            else:
                print('Employee Number not found!')
        except EOFError:
            break

Программа принимает первый ввод номера сотрудника, но после этого нет вывода.

Ответы [ 2 ]

0 голосов
/ 14 мая 2020

См. Встроенный модуль полка в python.

0 голосов
/ 14 мая 2020
  1. При открытии файлового объекта в режиме добавления позиция файлового объекта по умолчанию - это конец файла. Итак, когда вы пытаетесь l oop через файл, pickle не сможет прочитать файл и выдаст такую ​​ошибку:

    EOFError: Закончился ввод

    • Чтобы исправить это, добавьте f.seek(0) после открытия файлового объекта.

Плюс: «Ошибки никогда не должны проходить незаметно», как заявил «Тим Петерс. "в" Дзен Python ". Я бы посоветовал вам просто удалить блок try-except из вашего кода, потому что это считается плохой практикой незаметно заглушать ошибки.

Когда вы просматриваете список rec, вы обновляете переменную a, которая является просто локальной переменной for l oop. Обновление переменной a на самом деле не изменит исходный список. Для достижения желаемого результата вы должны получить элементы путем индексации исходного списка.
...