hlystik
@hlystik
«Самоучка»

Как добавить словарь в файл через модуль pickle?

Как добавить словарь в файл через модуль pickle ?
И чтобы в последствии этот словарь можно было вызывать в коде по ключам. И при этом словарь должен наполнятся через input.
Я новичок в Пайтон поэтому прошу простить если вопрос банален или неуместен, ниже привел код которым я пытался это сделать.

import pickle

users_choise = input("Желаете получить или ввести информацию - ")

file_name = 'Список.txt'

ff = open(file_name, 'rb')

baza = {ff}

if users_choise == 'ввести':
  for i in range(1):
    users_name = input("Введите имя - ")
    users_numbe = input("Введите номер - ")
    baza.update({users_name.title():users_numbe})

    print("Контакт добавлен !")

  file = 'Список.txt'
  f = open(file, 'wb')
  pickle.dump(baza, f)
  f.close



elif users_choise == 'получить':
  users_input_name = input("Введите имя контакта - ")

  data = baza.get(users_input_name)
  print(data)


users_doing = input(" Желаете закончить выполнения программы ? - ")

if users_doing == 'Да':
  print('Програма закрыта ', end = ' ')

elif users_doing == 'Нет':
  print(users_choise)
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну для начала я бы посоветовал использовать json вместо pickle. pickle даёт бинарную строку, которая нечитаема человеком. Кроме того, как написано большими красными буквами в доках на pickle, он имеет уязвимости, так что ни в коем случае нельзя передавать через него недоверенные данные.

В коде много кривых вызовов не по делу.
ff = open(file_name, 'rb')
baza = {ff}

Что сиё должно означать вообще? Ты создал множество из одного элемента - файлового объекта ff. Или ты ожидал, что это магически превратит файл в словарь?
Как правильно:
import json 
#оператор with обеспечит закрытие файла, как только управление покинет тело оператора
#явное указание кодировки подстрахует от получения "кракозябр" на выходе
#Кодировка utf-8 позволит использовать символы любых алфавитов.
with open('Список.txt', 'rt', encoding='utf-8') as ff:
    baza = json.load(ff)

Далее.
baza.update({users_name.title():users_numbe})
Зачем? Почему не написать просто:
baza[users_name.title()] = users_numbe
Далее.
f.close
Ты взял адрес метода close у объекта f. Ты НЕ вызвал метод close. Чтобы метод вызвать, нужно указать круглые скобки. Впрочем, если используешь with, то он вызовет close() за тебя.
Так что:
with open('Список.txt', 'wt', encoding='utf-8') as ff:
    json.dump(
        baza, #что записываем
        ff, #куда
        ensure_ascii=False, #не ASCII-строки пишем как есть, без кодирования
        indent="    ", #сделать отступ, не писать всё в одну строку
        sort_keys=True, #отсортировать ключи по алфавиту
    )

Остальное примерно так.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 22:38
2500 руб./за проект
23 нояб. 2024, в 22:03
3000 руб./за проект
23 нояб. 2024, в 21:53
30000 руб./за проект