Преобразование словаря в JSON и добавление в файл - PullRequest
0 голосов
/ 26 мая 2018

Сценарий: мне нужно преобразовать объект словаря в json и записать в файл.Новые объекты Dictionary будут отправляться при каждом вызове метода write_to_file (), и мне нужно добавить Json в файл. Ниже приведен код

def write_to_file(self, dict=None):
        f = open("/Users/xyz/Desktop/file.json", "w+")
        if json.load(f)!= None:
            data = json.load(f)
            data.update(dict)
            f = open("/Users/xyz/Desktop/file.json", "w+")
            f.write(json.dumps(data))
        else:

            f = open("/Users/xyz/Desktop/file.json", "w+")
            f.write(json.dumps(dict)

Получение этой ошибки «Никакой объект JSON не может быть декодирован», а Jsonне записывается в файл.Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 26 мая 2018

это выглядит слишком сложным и очень глючным.Если открыть файл несколько раз в режиме w+ и прочитать его дважды, это ни к чему не приведет, но создаст пустой файл, который json не сможет прочитать.

  • Iпроверил бы, существует ли файл, если да, я читаю его (иначе создаю пустой dict).
  • этот аргумент по умолчанию None не имеет смысла.Вы должны передать словарь или метод update не будет работать.Что ж, мы можем пропустить обновление, если объект «ложный».
  • не используйте dict в качестве имени переменной
  • , в конце перезаписать файл новой версиейваши данные (w+ и r+ должны быть зарезервированы для файлов фиксированного размера / двоичных файлов, а не для текстовых файлов / файлов json / xml)

Например:

def write_to_file(self, new_data=None):
     # define filename to avoid copy/paste
     filename = "/Users/xyz/Desktop/file.json"

     data = {}  # in case the file doesn't exist yet
     if os.path.exists(filename):
        with open(filename) as f:
           data = json.load(f)

     # update data with new_data if non-None/empty
     if new_data:
        data.update(new_data)

     # write the updated dictionary, create file if
     # didn't exist
     with open(filename,"w") as f:
         json.dump(data,f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...